Android 动画之AnimatorSet

来源:互联网 发布:九宫图算法计算器 编辑:程序博客网 时间:2024/05/29 17:10

Android动画系列:

  1. Android之补间动画详解
  2. Android 动画之帧动画
  3. Android 动画之LayoutAnimation
  4. Android 动画之属性动画(一)
  5. Android 动画之属性动画(二)
  6. Android 动画之属性动画(三)
  7. Android 动画之属性动画(四)
  8. Android 动画之LayoutTransition
  9. Android 动画之AnimatorSet

介绍

在Android系统里只允许对View设置有且仅有一个动画效果,不能够为同时给View设置多个动画。即使有一系列的动画,也只能允许一个动画执行,一个动画结束后在开始另外一个外一个动画。AnimatorSet是一个集合动画,允许对控件设置一系列的动画。在AnimatorSet里可以指定动画的播放顺序、是否一起播放或者是否延迟播放。

向AnimatorSet添加动画有两种不同的方法,其一是调用playTogether()或playSequentially()方法来一次性添加一组动画,其二是播放(Animator)可以与Builder类一个一个添加动画。

注:在添加系列动画时,一定要考虑到同时执行的动画之间是否会出现冲突。比如添加的动画且同时执行的,一个向左移动,另外一个向右移动,此时Android系统必然不知道如何处理,这种小失误应该是规避的。

AnimatorSet.Builder

AnimatorSet.Builder是一个使用的动画工具类,用于方便向AnimatorSet添加动画以及设置各种动画之间的关系。在AnimatorSet.Builder中,共声明了after(long)、after(Animator)、before(Animator)、with(Animator)等四个方法。

  • after(delay):设置动画延迟delay时间后播放
  • after(anim):设置在anim动画结束后播放此动画
  • before(anim):设置此动画早于anim播放
  • with(anim):设置此冬雨与anim一起播放

与playTogether()和playSequentially()方法想比较,采用AnimatorSet.Builder向AnimatorSet逐一添加动画,更能准确的知道动画的播放顺序。

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();

分析上述代码中的一系列动画的播放顺序如下:

  1. 执行bouncer

    1. bounceAnim
    2. squashAnim1与squashAnim2、stretchAnim1、stretchAnim2一起执行
    3. bounceBackAnim
  2. 执行fadeAnim

注:AnimatorSet.Builder的构造方法并未对外公布,如果想创建其实例,只能通过调用play(Animator)。

常用API

play(Animator anim):添加一个动画,并返回AnimatorSet.Builder
playSequentially(List items):添加一组动画,播放顺序为一一播放
playSequentially(Animator… items):添加一组动画,播放顺序为一一播放
playTogether(Collection items):添加一组动画,播放顺序为一起播放
playTogether(Animator… items):添加一组动画,播放顺序为一起播放

动画实例

play

AnimatorSet bouncer = new AnimatorSet();// 右移300fObjectAnimator objectAnimatorA = ObjectAnimator.ofFloat(btnProperty, PropertyConstant.PROPERTY_TRANSLATION_X, 0f, 300f);// 下移300fObjectAnimator objectAnimatorB = ObjectAnimator.ofFloat(btnProperty, PropertyConstant.PROPERTY_TRANSLATION_Y, 0f, 300f);// 从右边300f左移至原位置ObjectAnimator objectAnimatorC = ObjectAnimator.ofFloat(btnProperty, PropertyConstant.PROPERTY_TRANSLATION_X, 300f, 0f);// 旋转360度ObjectAnimator objectAnimatorD = ObjectAnimator.ofFloat(btnProperty, PropertyConstant.PROPERTY_ROTATION, 0f, 360f);bouncer.play(objectAnimatorA).before(objectAnimatorB);bouncer.play(objectAnimatorB).with(objectAnimatorD);bouncer.play(objectAnimatorC).after(objectAnimatorB);bouncer.setDuration(6000);bouncer.start();

分析代码中,动画的执行顺序分析如下:
1. objectAnimatorA早于objectAnimatorB执行
2. objectAnimatorB与objectAnimatorD一起执行
3. objectAnimatorC晚于objectAnimatorB

故而bouncer优先执行objectAnimatorA,然后执行objectAnimatorB与objectAnimatorD的混合动画,最后执行objectAnimatorC。

这里写图片描述

playSequentially

AnimatorSet bouncer = new AnimatorSet();ObjectAnimator objectAnimatorA = ObjectAnimator.ofFloat(btnProperty, PropertyConstant.PROPERTY_TRANSLATION_X, 0f, 300f);ObjectAnimator objectAnimatorB = ObjectAnimator.ofFloat(btnProperty, PropertyConstant.PROPERTY_TRANSLATION_Y, 0f, 300f);ObjectAnimator objectAnimatorC = ObjectAnimator.ofFloat(btnProperty, PropertyConstant.PROPERTY_ROTATION, 0f, 360f);bouncer.playSequentially(objectAnimatorA, objectAnimatorB, objectAnimatorC);bouncer.setDuration(6000);bouncer.start();

向bouncer通过playSequentially()将objectAnimatorA、objectAnimatorB及objectAnimatorC,其播放顺序为一一播放。

这里写图片描述

playTogether

AnimatorSet bouncer = new AnimatorSet();ObjectAnimator objectAnimatorA = ObjectAnimator.ofFloat(btnProperty, PropertyConstant.PROPERTY_TRANSLATION_X, 0f, 300f);ObjectAnimator objectAnimatorB = ObjectAnimator.ofFloat(btnProperty, PropertyConstant.PROPERTY_TRANSLATION_Y, 0f, 300f);ObjectAnimator objectAnimatorC = ObjectAnimator.ofFloat(btnProperty, PropertyConstant.PROPERTY_ROTATION, 0f, 360f);bouncer.playTogether(objectAnimatorA, objectAnimatorB, objectAnimatorC);    bouncer.setDuration(6000);    bouncer.start();

向bouncer通过playTogether()将objectAnimatorA、objectAnimatorB及objectAnimatorC,其播放顺序为一起播放。

这里写图片描述

0 0