prop-animation.jd revision 33baa5ad7d8cdcc89ce4fbc3bc8cd537d5f5d639
1page.title=Property Animation
2page.tags=valueanimator,objectanimator,layouttransition,ViewPropertyAnimator
3@jd:body
4
5  <div id="qv-wrapper">
6    <div id="qv">
7      <h2>In this document</h2>
8
9      <ol>
10        <li><a href="#how">How Property Animation Works</a></li>
11
12        <li><a href="#value-animator">Animating with ValueAnimator</a></li>
13
14        <li><a href="#object-animator">Animating with ObjectAnimator</a></li>
15
16        <li><a href="#choreography">Choreographing Multiple Animations with
17        AnimatorSet</a></li>
18
19        <li><a href="#listeners">Animation Listeners</a></li>
20
21        <li><a href="#type-evaluator">Using a TypeEvaluator</a></li>
22
23        <li><a href="#interpolators">Using Interpolators</a></li>
24
25        <li><a href="#keyframes">Specifying Keyframes</a></li>
26
27        <li><a href="#layout">Animating Layout Changes to ViewGroups</a></li>
28
29        <li><a href="#views">Animating Views</a>
30          <ol>
31            <li><a href="#view-prop-animator">ViewPropertyAnimator</a></li>
32          </ol>
33        </li>
34
35        <li><a href="#declaring-xml">Declaring Animations in XML</a></li>
36      </ol>
37
38      <h2>Key classes</h2>
39
40      <ol>
41        <li><code><a href=
42        "/reference/android/animation/ValueAnimator.html">ValueAnimator</a></code></li>
43
44        <li><code><a href=
45        "/reference/android/animation/ObjectAnimator.html">ObjectAnimator</a></code></li>
46
47        <li><code><a href=
48        "/reference/android/animation/TypeEvaluator.html">TypeEvaluator</a></code></li>
49      </ol>
50
51      <h2>Related samples</h2>
52
53      <ol>
54        <li><a href=
55        "{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/animation/index.html">API
56        Demos</a></li>
57      </ol>
58    </div>
59  </div>
60  <p>The property animation system is a robust framework that allows you
61  to animate almost anything. You can define an animation to change any object property over time,
62  regardless of whether it draws to the screen or not. A property animation changes a property's
63  (a field in an object) value over a specified length of time. To animate something, you specify the
64  object property that you want to animate, such as an object's position on the screen, how long
65  you want to animate it for, and what values you want to animate between. </p>
66
67  <p>The property animation system lets you define the following characteristics of an
68  animation:</p>
69
70  <ul>
71    <li>Duration: You can specify the duration of an animation. The default length is 300 ms.</li>
72
73    <li>Time interpolation: You can specify how the values for the property are calculated as a
74    function of the animation's current elapsed time.</li>
75
76    <li>Repeat count and behavior: You can specify whether or not to have an animation repeat when
77    it reaches the end of a duration and how many times to repeat the animation. You can also
78    specify whether you want the animation to play back in reverse. Setting it to reverse plays
79    the animation forwards then backwards repeatedly, until the number of repeats is reached.</li>
80
81    <li>Animator sets: You can group animations into logical sets that play together or
82    sequentially or after specified delays.</li>
83
84    <li>Frame refresh delay: You can specify how often to refresh frames of your animation. The
85    default is set to  refresh every 10 ms, but the speed in which your application can refresh frames is
86    ultimately dependent on how busy the system is overall and how fast the system can service the underlying timer.</li>
87  </ul>
88
89
90  <h2 id="how">How Property Animation Works</h2>
91
92  <p>First, let's go over how an animation works with a simple example. Figure 1 depicts a
93  hypothetical object that is animated with its <code>x</code> property, which represents its
94  horizontal location on a screen. The duration of the animation is set to 40 ms and the distance
95  to travel is 40 pixels. Every 10 ms, which is the default frame refresh rate, the object moves
96  horizontally by 10 pixels. At the end of 40ms, the animation stops, and the object ends at
97  horizontal position 40. This is an example of an animation with linear interpolation, meaning the
98  object moves at a constant speed.</p><img src="{@docRoot}images/animation/animation-linear.png">
99
100  <p class="img-caption"><strong>Figure 1.</strong> Example of a linear animation</p>
101
102  <p>You can also specify animations to have a non-linear interpolation. Figure 2 illustrates a
103  hypothetical object that accelerates at the beginning of the animation, and decelerates at the
104  end of the animation. The object still moves 40 pixels in 40 ms, but non-linearly. In the
105  beginning, this animation accelerates up to the halfway point then decelerates from the
106  halfway point until the end of the animation. As Figure 2 shows, the distance traveled
107  at the beginning and end of the animation is less than in the middle.</p><img src=
108  "{@docRoot}images/animation/animation-nonlinear.png">
109
110  <p class="img-caption"><strong>Figure 2.</strong> Example of a non-linear animation</p>
111
112  <p>Let's take a detailed look at how the important components of the property animation system
113  would calculate animations like the ones illustrated above. Figure 3 depicts how the main classes
114  work with one another.</p><img src="{@docRoot}images/animation/valueanimator.png">
115
116  <p class="img-caption"><strong>Figure 3.</strong> How animations are calculated</p>
117
118  <p>The {@link android.animation.ValueAnimator} object keeps track of your animation's timing,
119  such as how long the animation has been running, and the current value of the property that it is
120  animating.</p>
121
122  <p>The {@link android.animation.ValueAnimator} encapsulates a {@link
123  android.animation.TimeInterpolator}, which defines animation interpolation, and a {@link
124  android.animation.TypeEvaluator}, which defines how to calculate values for the property being
125  animated. For example, in Figure 2, the {@link android.animation.TimeInterpolator} used would be
126  {@link android.view.animation.AccelerateDecelerateInterpolator} and the {@link
127  android.animation.TypeEvaluator} would be {@link android.animation.IntEvaluator}.</p>
128
129  <p>To start an animation, create a {@link android.animation.ValueAnimator} and give it the
130  starting and ending values for the property that you want to animate, along with the duration of
131  the animation. When you call {@link android.animation.ValueAnimator#start start()} the animation
132  begins. During the whole animation, the {@link android.animation.ValueAnimator} calculates an <em>elapsed fraction</em>
133  between 0 and 1, based on the duration of the animation and how much time has elapsed. The
134  elapsed fraction represents the percentage of time that the animation has completed, 0 meaning 0%
135  and 1 meaning 100%. For example, in Figure 1, the elapsed fraction at t = 10 ms would be .25
136  because the total duration is t = 40 ms.</p>
137
138  <p>When the {@link android.animation.ValueAnimator} is done calculating an elapsed fraction, it
139  calls the {@link android.animation.TimeInterpolator} that is currently set, to calculate an
140  <em>interpolated fraction</em>. An interpolated fraction maps the elapsed fraction to a new
141  fraction that takes into account the time interpolation that is set. For example, in Figure 2,
142  because the animation slowly accelerates, the interpolated fraction, about .15, is less than the
143  elapsed fraction, .25, at t = 10 ms. In Figure 1, the interpolated fraction is always the same as
144  the elapsed fraction.</p>
145
146  <p>When the interpolated fraction is calculated, {@link android.animation.ValueAnimator} calls
147  the appropriate {@link android.animation.TypeEvaluator}, to calculate the value of the
148  property that you are animating, based on the interpolated fraction, the starting value, and the
149  ending value of the animation. For example, in Figure 2, the interpolated fraction was .15 at t =
150  10 ms, so the value for the property at that time would be .15 X (40 - 0), or 6.</p>
151
152 <!-- <p>When the final value is calculated, the {@link android.animation.ValueAnimator} calls the
153  {@link android.animation.ValueAnimator.AnimatorUpdateListener#onAnimationUpdate
154  onAnimationUpdate()} method. Implement this callback to obtain the property value by
155  calling {@link android.animation.ValueAnimator#getAnimatedValue getAnimatedValue()} and set the
156  value for the property in the object that you are animating. Setting the property doesn't redraw
157  the object on the screen, so you need to call {@link
158  android.view.View#invalidate invalidate()} to refresh the View that the object
159  resides in. If the object is actually a View object, then the system calls {@link
160  android.view.View#invalidate invalidate()} when the property is changed.
161  The system redraws the window and the {@link android.animation.ValueAnimator}
162  repeats the process.</p>-->
163
164  <p>The <code>com.example.android.apis.animation</code> package in the <a href=
165  "{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/animation/index.html">API
166  Demos</a> sample project provides many examples on how to use the property
167  animation system.</p>
168  
169  <h2 id="property-vs-view">How Property Animation Differs from View Animation</h2>
170  
171  <p>The view animation system provides the capability to only animate {@link android.view.View}
172  objects, so if you wanted to animate non-{@link android.view.View} objects, you have to implement
173  your own code to do so. The view animation system is also constrained in the fact that it only
174  exposes a few aspects of a {@link android.view.View} object to animate, such as the scaling and
175  rotation of a View but not the background color, for instance.</p>
176
177  <p>Another disadvantage of the view animation system is that it only modified where the
178  View was drawn, and not the actual View itself. For instance, if you animated a button to move
179  across the screen, the button draws correctly, but the actual location where you can click the
180  button does not change, so you have to implement your own logic to handle this.</p>
181
182  <p>With the property animation system, these constraints are completely removed, and you can animate
183  any property of any object (Views and non-Views) and the object itself is actually modified.
184  The property animation system is also more robust in the way it carries out animation. At
185  a high level, you assign animators to the properties that you want to animate, such as color,
186  position, or size and can define aspects of the animation such as interpolation and
187  synchronization of multiple animators.</p>
188
189  <p>The view animation system, however, takes less time to setup and requires less code to write.
190  If view animation accomplishes everything that you need to do, or if your existing code already
191  works the way you want, there is no need to use the property animation system. It also might
192  make sense to use both animation systems for different situations if the use case arises.</p>
193
194  <h2>API Overview</h2>
195
196  <p>You can find most of the property animation system's APIs in {@link android.animation
197  android.animation}. Because the view animation system already
198  defines many interpolators in {@link android.view.animation android.view.animation}, you can use
199  those interpolators in the property animation system as well. The following tables describe the main
200  components of the property animation system.</p>
201
202  <p>The {@link android.animation.Animator} class provides the basic structure for creating
203  animations. You normally do not use this class directly as it only provides minimal
204  functionality that must be extended to fully support animating values. The following
205  subclasses extend {@link android.animation.Animator}:
206  </p>
207  <p class="table-caption"><strong>Table 1.</strong> Animators</p>
208      <table>
209        <tr>
210          <th>Class</th>
211
212          <th>Description</th>
213        </tr>
214
215        <tr>
216          <td>{@link android.animation.ValueAnimator}</td>
217
218          <td>The main timing engine for property animation that also computes the values for the
219          property to be animated. It has all of the core functionality that calculates animation
220          values and contains the timing details of each animation, information about whether an
221          animation repeats, listeners that receive update events, and the ability to set custom
222          types to evaluate. There are two pieces to animating properties: calculating the animated
223          values and setting those values on the object and property that is being animated. {@link
224          android.animation.ValueAnimator} does not carry out the second piece, so you must listen
225          for updates to values calculated by the {@link android.animation.ValueAnimator} and
226          modify the objects that you want to animate with your own logic. See the section about
227          <a href="#value-animator">Animating with ValueAnimator</a> for more information.</td>
228        </tr>
229
230        <tr>
231          <td>{@link android.animation.ObjectAnimator}</td>
232
233          <td>A subclass of {@link android.animation.ValueAnimator} that allows you to set a target
234          object and object property to animate. This class updates the property accordingly when
235          it computes a new value for the animation. You want to use
236          {@link android.animation.ObjectAnimator} most of the time,
237          because it makes the process of animating values on target objects much easier. However,
238          you sometimes want to use {@link android.animation.ValueAnimator} directly because {@link
239          android.animation.ObjectAnimator} has a few more restrictions, such as requiring specific
240          acessor methods to be present on the target object.</td>
241        </tr>
242
243        <tr>
244          <td>{@link android.animation.AnimatorSet}</td>
245
246          <td>Provides a mechanism to group animations together so that they run in
247          relation to one another. You can set animations to play together, sequentially, or after
248          a specified delay. See the section about <a href="#choreography">Choreographing multiple
249          animations with Animator Sets</a> for more information.</td>
250        </tr>
251      </table>
252
253
254      <p>Evaluators tell the property animation system how to calculate values for a given
255      property. They take the timing data that is provided by an {@link android.animation.Animator}
256      class, the animation's start and end value, and calculate the animated values of the property
257      based on this data. The property animation system provides the following evaluators:</p>
258      <p class="table-caption"><strong>Table 2.</strong> Evaluators</p>
259      <table>
260        <tr>
261          <th>Class/Interface</th>
262
263          <th>Description</th>
264        </tr>
265
266        <tr>
267          <td>{@link android.animation.IntEvaluator}</td>
268
269          <td>The default evaluator to calculate values for <code>int</code> properties.</td>
270        </tr>
271
272        <tr>
273          <td>{@link android.animation.FloatEvaluator}</td>
274
275          <td>The default evaluator to calculate values for <code>float</code> properties.</td>
276        </tr>
277
278        <tr>
279          <td>{@link android.animation.ArgbEvaluator}</td>
280
281          <td>The default evaluator to calculate values for color properties that are represented
282          as hexidecimal values.</td>
283        </tr>
284
285        <tr>
286          <td>{@link android.animation.TypeEvaluator}</td>
287
288          <td>An interface that allows you to create your own evaluator. If you are animating an
289          object property that is <em>not</em> an <code>int</code>, <code>float</code>, or color,
290          you must implement the {@link android.animation.TypeEvaluator} interface to specify how
291          to compute the object property's animated values. You can also specify a custom {@link
292          android.animation.TypeEvaluator} for <code>int</code>, <code>float</code>, and color
293          values as well, if you want to process those types differently than the default behavior.
294          See the section about <a href="#type-evaluator">Using a TypeEvaluator</a> for more
295          information on how to write a custom evaluator.</td>
296        </tr>
297      </table>
298
299
300
301
302      <p>A time interpolator defines how specific values in an animation are calculated as a
303      function of time. For example, you can specify animations to happen linearly across the whole
304      animation, meaning the animation moves evenly the entire time, or you can specify animations
305      to use non-linear time, for example, accelerating at the beginning and decelerating at the
306      end of the animation. Table 3 describes the interpolators that are contained in {@link
307      android.view.animation android.view.animation}. If none of the provided interpolators suits
308      your needs, implement the {@link android.animation.TimeInterpolator} interface and create your own. See <a href=
309  "#interpolators">Using interpolators</a> for more information on how to write a custom
310  interpolator.</p>
311      <p class="table-caption"><strong>Table 3.</strong> Interpolators</p>
312      <table>
313        <tr>
314          <th>Class/Interface</th>
315
316          <th>Description</th>
317        </tr>
318
319        <tr>
320          <td>{@link android.view.animation.AccelerateDecelerateInterpolator}</td>
321
322          <td>An interpolator whose rate of change starts and ends slowly but accelerates
323          through the middle.</td>
324        </tr>
325
326        <tr>
327          <td>{@link android.view.animation.AccelerateInterpolator}</td>
328
329          <td>An interpolator whose rate of change starts out slowly and then
330          accelerates.</td>
331        </tr>
332
333        <tr>
334          <td>{@link android.view.animation.AnticipateInterpolator}</td>
335
336          <td>An interpolator whose change starts backward then flings forward.</td>
337        </tr>
338
339        <tr>
340          <td>{@link android.view.animation.AnticipateOvershootInterpolator}</td>
341
342          <td>An interpolator whose change starts backward, flings forward and overshoots
343          the target value, then finally goes back to the final value.</td>
344        </tr>
345
346        <tr>
347          <td>{@link android.view.animation.BounceInterpolator}</td>
348
349          <td>An interpolator whose change bounces at the end.</td>
350        </tr>
351
352        <tr>
353          <td>{@link android.view.animation.CycleInterpolator}</td>
354
355          <td>An interpolator whose animation repeats for a specified number of cycles.</td>
356        </tr>
357
358        <tr>
359          <td>{@link android.view.animation.DecelerateInterpolator}</td>
360
361          <td>An interpolator whose rate of change starts out quickly and and then
362          decelerates.</td>
363        </tr>
364
365        <tr>
366          <td>{@link android.view.animation.LinearInterpolator}</td>
367
368          <td>An interpolator whose rate of change is constant.</td>
369        </tr>
370
371        <tr>
372          <td>{@link android.view.animation.OvershootInterpolator}</td>
373
374          <td>An interpolator whose change flings forward and overshoots the last value then
375          comes back.</td>
376        </tr>
377
378        <tr>
379          <td>{@link android.animation.TimeInterpolator}</td>
380
381          <td>An interface that allows you to implement your own interpolator.</td>
382        </tr>
383      </table>
384
385  <h2 id="value-animator">Animating with ValueAnimator</h2>
386
387  <p>The {@link android.animation.ValueAnimator} class lets you animate values of some type for the
388  duration of an animation by specifying a set of <code>int</code>, <code>float</code>, or color
389  values to animate through. You obtain a {@link android.animation.ValueAnimator} by calling one of
390  its factory methods: {@link android.animation.ValueAnimator#ofInt ofInt()}, {@link
391  android.animation.ValueAnimator#ofFloat ofFloat()}, or {@link
392  android.animation.ValueAnimator#ofObject ofObject()}. For example:</p>
393  <pre>
394ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f);
395animation.setDuration(1000);
396animation.start();
397</pre>
398
399  <p>In this code, the {@link android.animation.ValueAnimator} starts calculating the values of the
400  animation, between 0 and 1, for a duration of 1000 ms, when the <code>start()</code> method
401  runs.</p>
402
403  <p>You can also specify a custom type to animate by doing the following:</p>
404  <pre>
405ValueAnimator animation = ValueAnimator.ofObject(new MyTypeEvaluator(), startPropertyValue, endPropertyValue);
406animation.setDuration(1000);
407animation.start();
408</pre>
409
410  <p>In this code, the {@link android.animation.ValueAnimator} starts calculating the values of the
411  animation, between <code>startPropertyValue</code> and <code>endPropertyValue</code> using the
412  logic supplied by <code>MyTypeEvaluator</code> for a duration of 1000 ms, when the {@link
413  android.animation.ValueAnimator#start start()} method runs.</p>
414
415  <p>The previous code snippets, however, has no real effect on an object, because the {@link
416  android.animation.ValueAnimator} does not operate on objects or properties directly. The most likely thing
417  that you want to do is modify the objects that you want to animate with these calculated values. You do
418  this by defining listeners in the {@link android.animation.ValueAnimator} to appropriately handle important events
419  during the animation's lifespan, such as frame updates. When implementing the listeners, you can
420  obtain the calculated value for that specific frame refresh by calling {@link
421  android.animation.ValueAnimator#getAnimatedValue getAnimatedValue()}. For more information on listeners,
422  see the section about <a href="#listeners">Animation Listeners</a>.
423
424  <h2 id="object-animator">Animating with ObjectAnimator</h2>
425
426  <p>The {@link android.animation.ObjectAnimator} is a subclass of the {@link
427  android.animation.ValueAnimator} (discussed in the previous section) and combines the timing
428  engine and value computation of {@link android.animation.ValueAnimator} with the ability to
429  animate a named property of a target object. This makes animating any object much easier, as you
430  no longer need to implement the {@link android.animation.ValueAnimator.AnimatorUpdateListener},
431  because the animated property updates automatically.</p>
432
433  <p>Instantiating an {@link android.animation.ObjectAnimator} is similar to a {@link
434  android.animation.ValueAnimator}, but you also specify the object and the name of that object's property (as
435  a String) along with the values to animate between:</p>
436  <pre>
437ObjectAnimator anim = ObjectAnimator.ofFloat(foo, "alpha", 0f, 1f);
438anim.setDuration(1000);
439anim.start();
440</pre>
441
442  <p>To have the {@link android.animation.ObjectAnimator} update properties correctly, you must do
443  the following:</p>
444
445  <ul>
446    <li>The object property that you are animating must have a setter function (in camel case) in the form of
447    <code>set&lt;propertyName&gt;()</code>. Because the {@link android.animation.ObjectAnimator}
448    automatically updates the property during animation, it must be able to access the property
449    with this setter method. For example, if the property name is <code>foo</code>, you need to
450    have a <code>setFoo()</code> method. If this setter method does not exist, you have three
451    options:
452
453      <ul>
454        <li>Add the setter method to the class if you have the rights to do so.</li>
455
456        <li>Use a wrapper class that you have rights to change and have that wrapper receive the
457        value with a valid setter method and forward it to the original object.</li>
458
459        <li>Use {@link android.animation.ValueAnimator} instead.</li>
460      </ul>
461    </li>
462
463    <li>If you specify only one value for the <code>values...</code> parameter in one of the {@link
464    android.animation.ObjectAnimator} factory methods, it is assumed to be the ending value of the
465    animation. Therefore, the object property that you are animating must have a getter function
466    that is used to obtain the starting value of the animation. The getter function must be in the
467    form of <code>get&lt;propertyName&gt;()</code>. For example, if the property name is
468    <code>foo</code>, you need to have a <code>getFoo()</code> method.</li>
469
470    <li>The getter (if needed) and setter methods of the property that you are animating must
471    operate on the same type as the starting and ending values that you specify to {@link
472    android.animation.ObjectAnimator}. For example, you must have
473    <code>targetObject.setPropName(float)</code> and <code>targetObject.getPropName(float)</code>
474    if you construct the following {@link android.animation.ObjectAnimator}:
475      <pre>
476ObjectAnimator.ofFloat(targetObject, "propName", 1f)
477</pre>
478    </li>
479
480    <li>Depending on what property or object you are animating, you might need to call the {@link
481    android.view.View#invalidate invalidate()} method on a View to force the screen to redraw itself with the
482    updated animated values. You do this in the
483    {@link android.animation.ValueAnimator.AnimatorUpdateListener#onAnimationUpdate onAnimationUpdate()}
484    callback. For example, animating the color property of a Drawable object only cause updates to the
485    screen when that object redraws itself. All of the property setters on View, such as
486    {@link android.view.View#setAlpha setAlpha()} and {@link android.view.View#setTranslationX setTranslationX()}
487    invalidate the View properly, so you do not need to invalidate the View when calling these
488    methods with new values. For more information on listeners, see the section about <a href="#listeners">Animation Listeners</a>.
489    </li>
490  </ul>
491
492  <h2 id="choreography">Choreographing Multiple Animations with AnimatorSet</h2>
493
494  <p>In many cases, you want to play an animation that depends on when another animation starts or
495  finishes. The Android system lets you bundle animations together into an {@link
496  android.animation.AnimatorSet}, so that you can specify whether to start animations
497  simultaneously, sequentially, or after a specified delay. You can also nest {@link
498  android.animation.AnimatorSet} objects within each other.</p>
499
500  <p>The following sample code taken from the <a href=
501  "{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/animation/BouncingBalls.html">Bouncing
502  Balls</a> sample (modified for simplicity) plays the following {@link android.animation.Animator}
503  objects in the following manner:</p>
504
505  <ol>
506    <li>Plays <code>bounceAnim</code>.</li>
507
508    <li>Plays <code>squashAnim1</code>, <code>squashAnim2</code>, <code>stretchAnim1</code>, and
509    <code>stretchAnim2</code> at the same time.</li>
510
511    <li>Plays <code>bounceBackAnim</code>.</li>
512
513    <li>Plays <code>fadeAnim</code>.</li>
514  </ol>
515  <pre>
516AnimatorSet bouncer = new AnimatorSet();
517bouncer.play(bounceAnim).before(squashAnim1);
518bouncer.play(squashAnim1).with(squashAnim2);
519bouncer.play(squashAnim1).with(stretchAnim1);
520bouncer.play(squashAnim1).with(stretchAnim2);
521bouncer.play(bounceBackAnim).after(stretchAnim2);
522ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);
523fadeAnim.setDuration(250);
524AnimatorSet animatorSet = new AnimatorSet();
525animatorSet.play(bouncer).before(fadeAnim);
526animatorSet.start();
527</pre>
528
529  <p>For a more complete example on how to use animator sets, see the <a href=
530  "{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/animation/BouncingBalls.html">Bouncing
531  Balls</a> sample in APIDemos.</p>
532
533<h2 id="listeners">Animation Listeners</h2>
534<p>
535You can listen for important events during an animation's duration with the listeners described below.
536</p>
537
538  <ul>
539    <li>{@link android.animation.Animator.AnimatorListener}
540
541      <ul>
542        <li>{@link android.animation.Animator.AnimatorListener#onAnimationStart onAnimationStart()}
543        - Called when the animation starts.</li>
544
545        <li>{@link android.animation.Animator.AnimatorListener#onAnimationEnd onAnimationEnd()} -
546        Called when the animation ends.</li>
547
548        <li>{@link android.animation.Animator.AnimatorListener#onAnimationRepeat
549        onAnimationRepeat()} - Called when the animation repeats itself.</li>
550
551        <li>{@link android.animation.Animator.AnimatorListener#onAnimationCancel
552        onAnimationCancel()} - Called when the animation is canceled. A cancelled animation
553        also calls {@link android.animation.Animator.AnimatorListener#onAnimationEnd onAnimationEnd()},
554        regardless of how they were ended.</li>
555      </ul>
556    </li>
557
558    <li>{@link android.animation.ValueAnimator.AnimatorUpdateListener}
559
560      <ul>
561        <li>
562          <p>{@link android.animation.ValueAnimator.AnimatorUpdateListener#onAnimationUpdate
563          onAnimationUpdate()} - called on every frame of the animation. Listen to this event to
564          use the calculated values generated by {@link android.animation.ValueAnimator} during an
565          animation. To use the value, query the {@link android.animation.ValueAnimator} object
566          passed into the event to get the current animated value with the {@link
567          android.animation.ValueAnimator#getAnimatedValue getAnimatedValue()} method. Implementing this
568          listener is required if you use {@link android.animation.ValueAnimator}. </p>
569
570          <p>
571          Depending on what property or object you are animating, you might need to call
572          {@link android.view.View#invalidate invalidate()} on a View to force that area of the
573          screen to redraw itself with the new animated values. For example, animating the
574          color property of a Drawable object only cause updates to the screen when that object
575          redraws itself. All of the property setters on View,
576          such as {@link android.view.View#setAlpha setAlpha()} and
577          {@link android.view.View#setTranslationX setTranslationX()} invalidate the View
578          properly, so you do not need to invalidate the View when calling these methods with new values.
579          </p>
580
581        </li>
582      </ul>
583    </li>
584  </ul>
585
586<p>You can extend the {@link android.animation.AnimatorListenerAdapter} class instead of
587implementing the {@link android.animation.Animator.AnimatorListener} interface, if you do not
588want to implement all of the methods of the {@link android.animation.Animator.AnimatorListener}
589interface. The {@link android.animation.AnimatorListenerAdapter} class provides empty
590implementations of the methods that you can choose to override.</p>
591  <p>For example, the <a href=
592  "{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/animation/BouncingBalls.html">Bouncing
593  Balls</a> sample in the API demos creates an {@link android.animation.AnimatorListenerAdapter}
594  for just the {@link android.animation.Animator.AnimatorListener#onAnimationEnd onAnimationEnd()}
595  callback:</p>
596  <pre>
597ValueAnimatorAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);
598fadeAnim.setDuration(250);
599fadeAnim.addListener(new AnimatorListenerAdapter() {
600public void onAnimationEnd(Animator animation) {
601    balls.remove(((ObjectAnimator)animation).getTarget());
602}
603</pre>
604
605
606  <h2 id="layout">Animating Layout Changes to ViewGroups</h2>
607
608  <p>The property animation system provides the capability to animate changes to ViewGroup objects
609  as well as provide an easy way to animate View objects themselves.</p>
610
611  <p>You can animate layout changes within a ViewGroup with the {@link
612  android.animation.LayoutTransition} class. Views inside a ViewGroup can go through an appearing
613  and disappearing animation when you add them to or remove them from a ViewGroup or when you call
614  a View's {@link android.view.View#setVisibility setVisibility()} method with {@link
615  android.view.View#VISIBLE}, android.view.View#INVISIBLE}, or {@link android.view.View#GONE}. The remaining Views in the
616  ViewGroup can also animate into their new positions when you add or remove Views. You can define
617  the following animations in a {@link android.animation.LayoutTransition} object by calling {@link
618  android.animation.LayoutTransition#setAnimator setAnimator()} and passing in an {@link
619  android.animation.Animator} object with one of the following {@link
620  android.animation.LayoutTransition} constants:</p>
621
622  <ul>
623    <li><code>APPEARING</code> - A flag indicating the animation that runs on items that are
624    appearing in the container.</li>
625
626    <li><code>CHANGE_APPEARING</code> - A flag indicating the animation that runs on items that are
627    changing due to a new item appearing in the container.</li>
628
629    <li><code>DISAPPEARING</code> - A flag indicating the animation that runs on items that are
630    disappearing from the container.</li>
631
632    <li><code>CHANGE_DISAPPEARING</code> - A flag indicating the animation that runs on items that
633    are changing due to an item disappearing from the container.</li>
634  </ul>
635
636  <p>You can define your own custom animations for these four types of events to customize the look
637  of your layout transitions or just tell the animation system to use the default animations.</p>
638
639  <p>The <a href=
640  "{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/animation/LayoutAnimations.html">
641  LayoutAnimations</a> sample in API Demos shows you how to define animations for layout
642  transitions and then set the animations on the View objects that you want to animate.</p>
643
644  <p>The <a href=
645  "{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/animation/LayoutAnimationsByDefault.html">
646  LayoutAnimationsByDefault</a> and its corresponding <a href=
647  "{@docRoot}resources/samples/ApiDemos/res/layout/layout_animations_by_default.html">layout_animations_by_default.xml</a>
648  layout resource file show you how to enable the default layout transitions for ViewGroups in XML.
649  The only thing that you need to do is to set the <code>android:animateLayoutchanges</code>
650  attribute to <code>true</code> for the ViewGroup. For example:</p>
651  <pre>
652&lt;LinearLayout
653    android:orientation="vertical"
654    android:layout_width="wrap_content"
655    android:layout_height="match_parent"
656    android:id="@+id/verticalContainer"
657    android:animateLayoutChanges="true" /&gt;
658</pre>
659
660  <p>Setting this attribute to true automatically animates Views that are added or removed from the
661  ViewGroup as well as the remaining Views in the ViewGroup.</p>
662
663  <h2 id="type-evaluator">Using a TypeEvaluator</h2>
664
665  <p>If you want to animate a type that is unknown to the Android system, you can create your own
666  evaluator by implementing the {@link android.animation.TypeEvaluator} interface. The types that
667  are known by the Android system are <code>int</code>, <code>float</code>, or a color, which are
668  supported by the {@link android.animation.IntEvaluator}, {@link
669  android.animation.FloatEvaluator}, and {@link android.animation.ArgbEvaluator} type
670  evaluators.</p>
671
672  <p>There is only one method to implement in the {@link android.animation.TypeEvaluator}
673  interface, the {@link android.animation.TypeEvaluator#evaluate evaluate()} method. This allows
674  the animator that you are using to return an appropriate value for your animated property at the
675  current point of the animation. The {@link android.animation.FloatEvaluator} class demonstrates
676  how to do this:</p>
677  <pre>
678public class FloatEvaluator implements TypeEvaluator {
679
680    public Object evaluate(float fraction, Object startValue, Object endValue) {
681        float startFloat = ((Number) startValue).floatValue();
682        return startFloat + fraction * (((Number) endValue).floatValue() - startFloat);
683    }
684}
685</pre>
686
687  <p class="note"><strong>Note:</strong> When {@link android.animation.ValueAnimator} (or {@link
688  android.animation.ObjectAnimator}) runs, it calculates a current elapsed fraction of the
689  animation (a value between 0 and 1) and then calculates an interpolated version of that depending
690  on what interpolator that you are using. The interpolated fraction is what your {@link
691  android.animation.TypeEvaluator} receives through the <code>fraction</code> parameter, so you do
692  not have to take into account the interpolator when calculating animated values.</p>
693
694  <h2 id="interpolators">Using Interpolators</h2>
695
696  <p>An interpolator define how specific values in an animation are calculated as a function of
697  time. For example, you can specify animations to happen linearly across the whole animation,
698  meaning the animation moves evenly the entire time, or you can specify animations to use
699  non-linear time, for example, using acceleration or deceleration at the beginning or end of the
700  animation.</p>
701
702  <p>Interpolators in the animation system receive a fraction from Animators that represent the
703  elapsed time of the animation. Interpolators modify this fraction to coincide with the type of
704  animation that it aims to provide. The Android system provides a set of common interpolators in
705  the {@link android.view.animation android.view.animation package}. If none of these suit your
706  needs, you can implement the {@link android.animation.TimeInterpolator} interface and create your
707  own.</p>
708
709  <p>As an example, how the default interpolator {@link
710  android.view.animation.AccelerateDecelerateInterpolator} and the {@link
711  android.view.animation.LinearInterpolator} calculate interpolated fractions are compared below.
712  The {@link android.view.animation.LinearInterpolator} has no effect on the elapsed fraction. The {@link
713  android.view.animation.AccelerateDecelerateInterpolator} accelerates into the animation and
714  decelerates out of it. The following methods define the logic for these interpolators:</p>
715
716  <p><strong>AccelerateDecelerateInterpolator</strong></p>
717  <pre>
718public float getInterpolation(float input) {
719    return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;
720}
721</pre>
722
723  <p><strong>LinearInterpolator</strong></p>
724  <pre>
725public float getInterpolation(float input) {
726    return input;
727}
728</pre>
729
730  <p>The following table represents the approximate values that are calculated by these
731  interpolators for an animation that lasts 1000ms:</p>
732
733  <table>
734    <tr>
735      <th>ms elapsed</th>
736
737      <th>Elapsed fraction/Interpolated fraction (Linear)</th>
738
739      <th>Interpolated fraction (Accelerate/Decelerate)</th>
740    </tr>
741
742    <tr>
743      <td>0</td>
744
745      <td>0</td>
746
747      <td>0</td>
748    </tr>
749
750    <tr>
751      <td>200</td>
752
753      <td>.2</td>
754
755      <td>.1</td>
756    </tr>
757
758    <tr>
759      <td>400</td>
760
761      <td>.4</td>
762
763      <td>.345</td>
764    </tr>
765
766    <tr>
767      <td>600</td>
768
769      <td>.6</td>
770
771      <td>.8</td>
772    </tr>
773
774    <tr>
775      <td>800</td>
776
777      <td>.8</td>
778
779      <td>.9</td>
780    </tr>
781
782    <tr>
783      <td>1000</td>
784
785      <td>1</td>
786
787      <td>1</td>
788    </tr>
789  </table>
790
791  <p>As the table shows, the {@link android.view.animation.LinearInterpolator} changes the values
792  at the same speed, .2 for every 200ms that passes. The {@link
793  android.view.animation.AccelerateDecelerateInterpolator} changes the values faster than {@link
794  android.view.animation.LinearInterpolator} between 200ms and 600ms and slower between 600ms and
795  1000ms.</p>
796
797  <h2 id="keyframes">Specifying Keyframes</h2>
798
799  <p>A {@link android.animation.Keyframe} object consists of a time/value pair that lets you define
800  a specific state at a specific time of an animation. Each keyframe can also have its own
801  interpolator to control the behavior of the animation in the interval between the previous
802  keyframe's time and the time of this keyframe.</p>
803
804  <p>To instantiate a {@link android.animation.Keyframe} object, you must use one of the factory
805  methods, {@link android.animation.Keyframe#ofInt ofInt()}, {@link
806  android.animation.Keyframe#ofFloat ofFloat()}, or {@link android.animation.Keyframe#ofObject
807  ofObject()} to obtain the appropriate type of {@link android.animation.Keyframe}. You then call
808  the {@link android.animation.PropertyValuesHolder#ofKeyframe ofKeyframe()} factory method to
809  obtain a {@link android.animation.PropertyValuesHolder} object. Once you have the object, you can
810  obtain an animator by passing in the {@link android.animation.PropertyValuesHolder} object and
811  the object to animate. The following code snippet demonstrates how to do this:</p>
812  <pre>
813Keyframe kf0 = Keyframe.ofFloat(0f, 0f);
814Keyframe kf1 = Keyframe.ofFloat(.5f, 360f);
815Keyframe kf2 = Keyframe.ofFloat(1f, 0f);
816PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe("rotation", kf0, kf1, kf2);
817ObjectAnimator rotationAnim = ObjectAnimator.ofPropertyValuesHolder(target, pvhRotation)
818rotationAnim.setDuration(5000ms);
819</pre>
820
821  <p>For a more complete example on how to use keyframes, see the <a href=
822  "{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/animation/MultiPropertyAnimation.html">
823  MultiPropertyAnimation</a> sample in APIDemos.</p>
824
825  <h2 id="views">Animating Views</h2>
826
827  <p>The property animation system allow streamlined animation of View objects and offers
828  a few advantages over the view animation system. The view
829  animation system transformed View objects by changing the way that they were drawn. This was
830  handled in the container of each View, because the View itself had no properties to manipulate.
831  This resulted in the View being animated, but caused no change in the View object itself. This
832  led to behavior such as an object still existing in its original location, even though it was
833  drawn on a different location on the screen. In Android 3.0, new properties and the corresponding
834  getter and setter methods were added to eliminate this drawback.</p>
835  <p>The property animation system
836  can animate Views on the screen by changing the actual properties in the View objects. In
837  addition, Views also automatically call the {@link android.view.View#invalidate invalidate()}
838  method to refresh the screen whenever its properties are changed. The new properties in the {@link
839  android.view.View} class that facilitate property animations are:</p>
840
841  <ul>
842    <li><code>translationX</code> and <code>translationY</code>: These properties control where the
843    View is located as a delta from its left and top coordinates which are set by its layout
844    container.</li>
845
846    <li><code>rotation</code>, <code>rotationX</code>, and <code>rotationY</code>: These properties
847    control the rotation in 2D (<code>rotation</code> property) and 3D around the pivot point.</li>
848
849    <li><code>scaleX</code> and <code>scaleY</code>: These properties control the 2D scaling of a
850    View around its pivot point.</li>
851
852    <li><code>pivotX</code> and <code>pivotY</code>: These properties control the location of the
853    pivot point, around which the rotation and scaling transforms occur. By default, the pivot
854    point is located at the center of the object.</li>
855
856    <li><code>x</code> and <code>y</code>: These are simple utility properties to describe the
857    final location of the View in its container, as a sum of the left and top values and
858    translationX and translationY values.</li>
859
860    <li><code>alpha</code>: Represents the alpha transparency on the View. This value is 1 (opaque)
861    by default, with a value of 0 representing full transparency (not visible).</li>
862  </ul>
863
864  <p>To animate a property of a View object, such as its color or rotation value, all you need to
865  do is create a property animator and specify the View property that you want to
866  animate. For example:</p>
867  <pre>
868ObjectAnimator.ofFloat(myView, "rotation", 0f, 360f);
869</pre>
870
871<p>For more information on creating animators, see the sections on animating with
872<a href="#value-animator">ValueAnimator</a> and <a href="#object-animator">ObjectAnimator</a>.
873</p>
874
875<h3 id="view-prop-animator">Animating with ViewPropertyAnimator</h3>
876<p>The {@link android.view.ViewPropertyAnimator} provides a simple way to animate several
877properties of a {@link android.view.View} in parallel, using a single underlying {@link
878android.animation.Animator}
879object. It behaves much like an {@link android.animation.ObjectAnimator}, because it modifies the
880actual values of the view's properties, but is more efficient when animating many properties at
881once. In addition, the code for using the {@link android.view.ViewPropertyAnimator} is much
882more concise and easier to read. The following code snippets show the differences in using multiple
883{@link android.animation.ObjectAnimator} objects, a single
884{@link android.animation.ObjectAnimator}, and the {@link android.view.ViewPropertyAnimator} when
885simultaneously animating the <code>x</code> and <code>y</code> property of a view.</p>
886
887<p><strong>Multiple ObjectAnimator objects</strong></p>
888<pre>
889ObjectAnimator animX = ObjectAnimator.ofFloat(myView, "x", 50f);
890ObjectAnimator animY = ObjectAnimator.ofFloat(myView, "y", 100f);
891AnimatorSet animSetXY = new AnimatorSet();
892animSetXY.playTogether(animX, animY);
893animSetXY.start();
894</pre>
895
896<p><strong>One ObjectAnimator</strong></p>
897<pre>
898PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("x", 50f);
899PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("y", 100f);
900ObjectAnimator.ofPropertyValuesHolder(myView, pvhX, pvyY).start();
901</pre>
902
903<p><strong>ViewPropertyAnimator</strong></p>
904<pre>
905myView.animate().x(50f).y(100f);
906</pre>
907
908<p>
909For more detailed information about {@link
910android.view.ViewPropertyAnimator}, see the corresponding Android Developers
911<a href="http://android-developers.blogspot.com/2011/05/introducing-viewpropertyanimator.html">blog
912post</a>.</p>
913
914<h2 id="declaring-xml">Declaring Animations in XML</h2>
915
916  <p>The property animation system lets you declare property animations with XML instead of doing
917  it programmatically. By defining your animations in XML, you can easily reuse your animations
918in multiple activities and more easily edit the animation sequence.</p>
919
920<p>To distinguish animation files that use the new property animation APIs from those that use the
921legacy <a href="{@docRoot}guide/topics/graphics/view-animation.html">view animation</a> framework,
922starting with Android 3.1, you should save the XML files for property animations in the {@code
923res/animator/} directory (instead of {@code res/anim/}). Using the {@code animator} directory name
924is optional, but necessary if you want to use the layout editor tools in the Eclipse ADT plugin (ADT
92511.0.0+), because ADT only searches the {@code res/animator/} directory for property animation
926resources.</p>
927
928<p>The following property animation classes have XML declaration support with the
929  following XML tags:</p>
930
931  <ul>
932    <li>{@link android.animation.ValueAnimator} - <code>&lt;animator&gt;</code></li>
933
934    <li>{@link android.animation.ObjectAnimator} - <code>&lt;objectAnimator&gt;</code></li>
935
936    <li>{@link android.animation.AnimatorSet} - <code>&lt;set&gt;</code></li>
937  </ul>
938
939<p>The following example plays the two sets of object animations sequentially, with the first nested
940set playing two object animations together:</p>
941
942<pre>
943&lt;set android:ordering="sequentially"&gt;
944    &lt;set&gt;
945        &lt;objectAnimator
946            android:propertyName="x"
947            android:duration="500"
948            android:valueTo="400"
949            android:valueType="intType"/&gt;
950        &lt;objectAnimator
951            android:propertyName="y"
952            android:duration="500"
953            android:valueTo="300"
954            android:valueType="intType"/&gt;
955    &lt;/set&gt;
956    &lt;objectAnimator
957        android:propertyName="alpha"
958        android:duration="500"
959        android:valueTo="1f"/&gt;
960&lt;/set&gt;
961</pre>
962  <p>In order to run this animation, you must inflate the XML resources in your code to an {@link
963  android.animation.AnimatorSet} object, and then set the target objects for all of the animations
964  before starting the animation set. Calling {@link android.animation.AnimatorSet#setTarget
965  setTarget()} sets a single target object for all children of the {@link
966  android.animation.AnimatorSet} as a convenience. The following code shows how to do this:</p>
967
968<pre>
969AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext,
970    R.anim.property_animator);
971set.setTarget(myObject);
972set.start();
973</pre>
974
975<p>For information about the XML syntax for defining property animations, see <a
976href="{@docRoot}guide/topics/resources/animation-resource.html#Property">Animation Resources</a>.
977
978