AnimatorSeth和AnimatorListener

来源:互联网 发布:admair 知乎 编辑:程序博客网 时间:2024/06/09 16:00
使用AnimatorSet来设计执行多个动画
很多时候,你希望一个动画的执行依赖于另一个动画的开始或结束。Android系统允许你使用AnimatorSet来把多个动画捆绑在一起,这样你可以让多个动画同时执行,或者顺序执行,或者在指定的延时后执行。你也可以嵌套AnimatorSet。
下面的例子来自于Bouncing Balls(修改了更简单),它以下面的行为执行各个动画:
1、播放bounceAnim.
2、同时播放squashAnim1, squashAnim2, stretchAnim1, and stretchAnim2;
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();
要获取使用animator sets的完整实例,你可以查看APIDemos中的Bouncing Balls例子
动画监听器
你可以使用下面的监听器来监听动画播放过程中的重要事件:
Animator.AnimatorListener中的接口
onAnimationStart() - 当动画开始的时候调用.
onAnimationEnd() - 动画结束时调用.
onAnimationRepeat() - 动画重复时调用.
onAnimationCancel() - 动画取消时调用.取消动画也会调用onAnimationEnd,它不会关系动画是怎么结束的。
ValueAnimator.AnimatorUpdateListener中的接口
onAnimationUpdate()动画中每一帧更新的时候调用,监听这个接口可以使用动画播放过程中由ValueAnimator计算出来的值。为了使用这个值,使用传递给事件的ValueAnimator的对象的 getAnimatedValue()接口来获取当前的动画值。如果你使用 ValueAnimator,必须实现这个方法。
依赖于你设置动画的对象或属性,你可能需要调用View的invalidate()方法来强制View占用的这部分区域使用新的属性值进行重绘自己。例如,当为Drawable 对象的颜色属性设置动画时,你只需要在该对象重绘的时候更新屏幕。所有View属性的set方法,如setAlpah()和setTranslationX()内部会自己适时的刷新View.所以在更新这些值的好似好你不需要调用invalid方法。
如果你不想实现Animator.AnimatorListener中的所有接口,你可以通过继承AnimatorListenerAdapter而不是去实现Animator.AnimatorListener接口。AnimatorListenerAdapter类为所有的方法提供了一个空实现,所以你可以根据需要实现你需要的,覆盖AnimatorListenerAdapter总原来的方法
例如:API demos中的实例Bouncing Balls创建了一个AnimatorListenerAdapter但仅仅实现了onAnimationEnd()回调:
ValueAnimatorAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);fadeAnim.setDuration(250);fadeAnim.addListener(new AnimatorListenerAdapter() {public void onAnimationEnd(Animator animation) {    balls.remove(((ObjectAnimator)animation).getTarget());}


1 0