What is the default interpolator if android:interpolator is unspecified - android

In Android, I know we can define animations via an XML file.
For example, scale_button_up.xml might look something like:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="#android:anim/linear_interpolator"
android:fillBefore="true"
android:fillAfter="true"
android:fillEnabled="true">
<scale
android:duration="5000"
android:fromXScale="0.25"
android:fromYScale="0.25"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="0.75"
android:toYScale="0.75"/>
</set>
I was wondering what the default behavior is for Android version 21+
android:interpolator="#android:anim/linear_interpolator"
If the above were not specified. I can't seem to find the relevant documentation.

All *Animation classes are subclasses of Animation, and it handles setting the interpolator specified in XML attributes in its constructor. If there isn't one specified, the default AccelerateDecelerateInterpolator is set in its ensureInterpolator() method.
/**
* Gurantees that this animation has an interpolator. Will use
* a AccelerateDecelerateInterpolator is nothing else was specified.
*/
protected void ensureInterpolator() {
if (mInterpolator == null) {
mInterpolator = new AccelerateDecelerateInterpolator();
}
}

Related

Android - Custom Interpolator Class Reference In Xml

I have written my own custom interpolator class .
#Override
public float getInterpolation(float t) {
return t*t*t;
}
I am doing Fragment slide in and slide out animation .There I want to give the reference of this interpolator class in the xml.
But In the xml I am only able to add android provided interpolators.
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="594"
android:startOffset="0"
android:interpolator="#android:anim/accelerate_decelerate_interpolator"
android:toXDelta="0"
android:fillAfter="true"
android:duration="400"/>
</set>
So basically I wanted to know how to give reference of Custom Interpolator class in Xml.
Create your custom interpolator and save it in a XML file in the res/anim folder of your project. For example
XML file saved at res/anim/my_interpolator.xml:
Then where ever you need to use it access it like given below
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="#anim/my_interpolator"
android:fromXScale="1.0"
android:toXScale="3.0"
android:fromYScale="1.0"
android:toYScale="3.0"
android:pivotX="50%"
android:pivotY="50%"
android:duration="700" />
In the android:interpolator section of your XML file change your default #android/ to #anim/ and choose your custom interpolator.
This works for me. Let me know if you have any trouble. Thanks.

Is it possible to inherit an anim xml resource from another and overwrite attributes?

I have these two files in res/anim folder:
my_anim.xml
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<rotate
android:duration="3000"
android:interpolator="#android:anim/linear_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="infinite"
android:repeatMode="restart"
android:toDegrees="360" />
</set>
my_anim_faster.xml
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<rotate
android:duration="1000"
android:interpolator="#android:anim/linear_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="infinite"
android:repeatMode="restart"
android:toDegrees="360" />
</set>
Both are the same animation, only the speed (android:duration) changes. Is there a way to make this code shorter? For instance, by my_anim_faster inheriting from my_anim and overwrite android:duration attribute or something similar.
Thanks.
A little briefing: XML resource cannot be inherited. The xml approach gives you the ability to create easy and fast resources like drawables, animations and layouts, but there is no way to inherit them. Google added fragments that allows you to extend and reuse layout functionality in some way but this is not an inheritance. In drawable/animation resources you can reuse other resources but you cannot extend them. So if you want to reuse some logic try to design your resources such a way that you can reuse them in another ones.
Now to your case: No, there is no way to do this via xml. Using xml you can only describe your resource. You can change the duration using java code programmatically.
Animation myAnimation = ...;
...
myAnimation.setDuration(1000);
As far as i'm aware you can't inherit other animations when creating an animation in xml like how you can "include" a layout when creating a layout.
Your best bet would to create the animation programmatically (in an AnimationUtils class for example) and when you call it supply the duration as an argument. e.g.
MyAnim myAnim = new MyAnim(1000);

TextView alpha animation doesn't work

I've got a BubbleTextView which is basically a TextView with some additions used in Launcher3 to display icons on the homescreen. I'm trying to animate this view via this XML
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="#android:anim/anticipate_interpolator"
android:duration="#android:integer/config_shortAnimTime"
android:startOffset="350"
android:fillAfter="true" >
<alpha
android:fromAlpha="1.0"
android:toAlpha="0.0" />
<translate
android:fromYDelta="0"
android:toYDelta="200" />
</set>
But whenever I start the animation it'll only translate the image and the alpha part won't work, so there is no fade out animation. What am I doing wrong here?
I figured out that BubbleTextView overrides onSetAlpha
#Override
protected boolean onSetAlpha(int alpha) {
if (mPrevAlpha != alpha) {
mPrevAlpha = alpha;
super.onSetAlpha(alpha);
}
return true;
}
Seems to be some relict of older revisions.
Since the implementation is not needed anymore it's safe to either delete the method or return false instead.

Avoid animation automatically "unwinding"?

I've a simple view animation, but I can't see to get "rid" of the animation "unwinding" (and I can't seem to find a solution online).
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="#android:anim/linear_interpolator"
android:shareInterpolator="true" >
<scale
android:duration="250"
android:fromXScale="1"
android:fromYScale="1"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="0"
android:toXScale="1.1"
android:toYScale="1.1" />
</set>
What this does is, simply, inflates the View by 10% proportionally, from the middle.
But, when it executes, it inflates and, when it reaches the end, it deflates back. I want to avoid that -- the "unwinding" effect -- when it scales back from 110% to 100%.
How can that be done?
Edit:
I'm starting it simply with this:
Animation animation1 = AnimationUtils.loadAnimation(this, R.anim.<name>);
v.startAnimation(animation1);
The correct answer is found here: How can I animate a view in Android and have it stay in the new position/size?
It is putting this:
android:fillAfter="true"
android:fillEnabled="true"
inside the <set tag.

Android tween animation blinks fast and doesn't work

I am trying to make a TextView scale and fade out. My TextView is inside a layout file that is included into my activity's layout with
<include android:id="#+id/hud" layout="#layout/hud" android:layout_alignParentBottom="true"/>
Now, I can apply a scale animation from within the Java code like this:
TextView multiplier = (TextView)findViewById(R.id.hudMultiplier);
ScaleAnimation s = new ScaleAnimation(1.0f, 3.0f, 1.0f,3.0f);
s.setDuration(5000);
multiplier.startAnimation(s);
And it works nicely, but I want that animation (and a bunch of others) from an xml file. So I made this file:
<?xml version="1.0" encoding="utf-8"?>
<set
xmlns:android="http://shemas.android.com/apk/res/android"
android:shareInterpolator="false">
<scale
android:pivotX="50%"
android:pivotY="100%"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:toXScale="10.0"
android:toYScale="10.0"
android:duration="5000"
android:interpolator="#android:anim/accelerate_decelerate_interpolator"
/>
<alpha
android:fromAlpha="1.0"
android:toAlpha="0.1"
android:duration="2000"
android:startOffset="2000">
</alpha>
</set>
I am trying to apply the animation with this code:
TextView multiplier = (TextView)findViewById(R.id.hudMultiplier);
AnimationSet an = (AnimationSet) AnimationUtils.loadAnimation(getApplicationContext(), R.anim.multiplier);
multiplier.startAnimation(an);
What happens now is that the TextView blinks for a fraction of a second and nothing actually happens.
I've tried:
removing the alpha animation - no change
removing the start offset - no change
change the animation with one from the android documentation - no change
change AnimationSet to Animation - no change
change getApplicationContext() to this, MyActivity.this - no change
change getApplicationContext() to null - kills the application
What am I missing?
The project is targeted at Android 1.6 and I'm testing in a 2.3 emulator.
This seems to make a difference, for me anyway!
Change shemas to schemas in the Set element.
<?xml version="1.0" encoding="utf-8"?>
<set
xmlns:android="http://shemas.android.com/apk/res/android"
android:shareInterpolator="false">
try this:
an = AnimationUtils.loadAnimation(this, android.R.anim.fade_out);

Categories

Resources