用AnimatorSet类来编排多个动画

转载自:http://www.2cto.com/kf/201207/139085.html

用AnimatorSet类来编排多个动画

在很多场景中,一个动画的播放要依赖与另一个动画的开始或结束。Android系统让你把这些相互依赖的动画绑定到一个AnimatorSet对象中,以便能够指定它们是同时的、顺序的、或在指定的延时之后来播放。AnimatorSet对象也能够彼此嵌套。

以下示例代码来自Bouncing Balls示例,它按照以下方式播放Animator对象:

1.  播放bounceAnim

2.  同时播放squashAnim1、squashAnim2、stretchAnim1和stetchAnim2

3.  播放bounceBackAnim

4.  播放fadeAnim

AnimatorSet bouncer = new AnimatorSet();

bouncer.play(bounceAnim).before(squashAnim1);

bouncer.play(squashAnim1).with(squashAnim2);

bouncer.play(squashAnim1).with(stretchAnim1);

bouncer.play(squashAnim1).with(stretchAnim2);

bouncer.play(bounceBackAnim).after(stretchAnim2);

ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);

fadeAnim.setDuration(250);

AnimatorSet animatorSet = new AnimatorSet();

animatorSet.play(bouncer).before(fadeAnim);

animatorSet.start();

关于如何使用动画集的完整示例,请看APIDemo中的Bouncing Balls示例。

动画监听器

使用下列介绍的监听器能够监听动画播放期间的重要事件:

1.  Animator.AnimatorListener

onAnimationStart()---动画开始的时候被调用

onAnimationEnd()---动画结束的时候被调用,它不管动画是如何结束的。

onAnimationRepeate()---动画重复播放的时候被调用

onAnimationCancel()---动画被取消播放的时候被调用。

2.  ValueAnimator.AnimatorUpdateListener

onAnimationUpdate()---在动画的帧上调用这个方法。通过监听这个事件,使用在动画期间由ValueAnimator对象产生的计算值。要使用这个值,就要用getAnimateValue()方法查询传递到事件中的ValueAnimator对象,以便获得当前的动画值。如果使用ValueAnimator类,那么实现这个监听器是必须的。

根据属性或对象的动画效果,可能需要调用View对象上的invalidate()方法,用新的动画值来强制屏幕的指定区域进行重绘。例如,Drawable对象的颜色属性的动画效果,在对象重绘自己的时候,只会导致屏幕的更新。在View对象上的所有属性的设置器,如setAlpha()、setTranslationX()等方法都会正确的让View对象失效,因此在调用这些方法设置新值的时候,你不需要让该View对象失效。

如果不实现Animator.AnimatorListener接口的所有方法,你能够继承AnimatorListenerAdapter类,来代替对Animator.AnimatorListener接口的实现。AnimatorListenerAdapter类对这些方法提供了空的实现,你可以选择性的重写这些方法。

例如,APIDemo中的Bouncing Balls示例就只创建了一个AnimatorListenerdapter类的onAnimationEnd()回调方法:

ValueAnimatorAnimator fadeAnim =ObjectAnimator.ofFloat(newBall,"alpha",1f,0f);fadeAnim.setDuration(250);fadeAnim.addListener(newAnimatorListenerAdapter(){publicvoid onAnimationEnd(Animator animation){    balls.remove(((ObjectAnimator)animation).getTarget());}

你可能感兴趣的:(用AnimatorSet类来编排多个动画)