Android 动画之AnimatorSet

Posted 行云间

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 动画之AnimatorSet相关的知识,希望对你有一定的参考价值。

android动画系列:

介绍

在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();
// 右移300f
ObjectAnimator objectAnimatorA = ObjectAnimator.ofFloat(btnProperty, PropertyConstant.PROPERTY_TRANSLATION_X, 0f, 300f);
// 下移300f
ObjectAnimator 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,其播放顺序为一起播放。

以上是关于Android 动画之AnimatorSet的主要内容,如果未能解决你的问题,请参考以下文章

一起Talk Android吧(第四百九十回:动画集合AnimatorSet)

AnimatorSet的用法(多动画同时播放)

Android属性动画之XML定义方式

View体系之属性动画

android studio怎么找不到com,nineoldandroids,animation,animatorset

一起Talk Android吧(第四百九十一回:动画集合AnimatorSetBuilder)