6.联合动画:代码和XML实现

  • Animator:
    • AnimatorSet
    • ValueAnimator
      • ObjectAnimator
      • TimerAnimator

其他方法实现AnimatorSet:

  • PropertyValuesHolder。
  • view自带方法。
ivSplashBg.animate().scaleX(1.2f).scaleY(1.2f).setDuration(2000)
                .setStartDelay(400)
                .start();

AnimatorSet:

AnimatorSet针对ValueAnimator和ObjectAnimator都是适用的,但一般而言,我们不会用到ValueAnimator的组合动画,所以我们这篇仅讲解ObjectAnimator下的组合动画实现。

playTogether/playSequentially

// 按次序播放动画
public void playSequentially(Animator... items); 
public void playSequentially(List items);

// 一起播放动画
public void playTogether(Animator... items);
public void playTogether(Collection items);
ObjectAnimator anim1 = ObjectAnimator.ofInt(mTv1, "BackgroundColor",  0xffff00ff, 0xffffff00, 0xffff00ff);

ObjectAnimator anim2 = ObjectAnimator.ofFloat(mTv1, "translationY", 0, 400, 0);
anima2.setStartDelay(2000);
anima2.setRepeatCount(ValueAnimator.INFINITE);

ObjectAnimator anim3 = ObjectAnimator.ofFloat(mTv2, "translationY", 0, 400, 0);
anim3.setStartDelay(2000);

AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(anim1, anim2, anim3);
animatorSet.setDuration(2000);
animatorSet.start();

无论是playTogether还是playSequentially方法,它们只是,仅仅是激活了动画什么时候开始,并不参与动画的具体操作。
例如:如果是playTogether,它只负责这个歌动画什么时候一起激活,至于anim1/anim2/anim3...哪个马上开始,哪个有延迟,哪个会无限重复,set都不管,只负责一起激活。
如果是playSequentially,它只负责什么时候开始激活第一个(因为有可能set设置延迟),并在第一个动画结束的时候,激活第二个,以此类推。

6.联合动画:代码和XML实现_第1张图片
image

通用的一些方法单独设置和AnimatorSet设置的区别:

无论是ObjectAnimator还是AnimatorSet都有这些方法,因为两者都是继承的Animator类的方法,那么当ObjectAnimator和AnimatorSet中都有设置同意函数时,以哪个为准?

  • 以set为准:
//设置单次动画时长
public AnimatorSet setDuration(long duration);
//设置加速器
public void setInterpolator(TimeInterpolator interpolator)
//设置ObjectAnimator动画目标控件
public void setTarget(Object target)
ObjectAnimator anim1 = ObjectAnimator.ofFloat(mTv1, "translationY", 0, 400, 0);
anim1.setDuration(500000000);

ObjectAnimator anim2 = ObjectAnimator.ofFloat(mTv2, "translationY", 0, 400, 0);
anim2.setDuration(3000);
anim2.setRepeatCount(3);

AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(tv2TranslateY).with(tv1TranslateY);
animatorSet.setDuration(2000);
animatorSet.start();

setDuration()是指单个动画的时间,并不是指总共做完这个动画过程的时间
比如:anim2中设置了3000ms,重复3次。是指每次3000ms,不是3次3000ms。
另外:animatorSet设置了时间以后,anim1/anim2虽然也设置了,但是这时以set为准。即,anim1/anim2的单个动画时间为2000ms。只不过anim2是每次2000ms,重复3次,共6000ms。

  • 不以set为准:setStartDelay
ObjectAnimator anim1 = ObjectAnimator.ofFloat(mTv1, "translationY", 0, 400, 0);
ObjectAnimator anim2 = ObjectAnimator.ofFloat(mTv2, "translationY", 0, 400, 0);
anim2.setStartDelay(2000);

AnimatorSet animatorSet = new AnimatorSet();
animatorSet.addListener(new Animator.AnimatorListener(){...});
animatorSet.play(anim1).with(anim2);
animatorSet.setStartDelay(3000);
animatorSet.setDuration(2000);
animatorSet.start();

setStartDelay不会覆盖单个动画的该方法,只会延长set的激活时间。所以,上面代码中动画的启动过程是:3000ms后set开始激活动画,anim1启动,anim2再过2000ms启动。

注意play(anim1).with(anim2)和play(anim2).with(anim1)的区别:

  • play(anim1).with(anim2):3000ms后set开始激活动画,anim1启动,anim2再过2000ms启动。
  • play(anim2).with(anim1):3000ms后set开始激活动画,再过2000ms后启动anim2,并且启动anim1.

set监听:addListener监听的是AnimatorSet的start/end/cacle/repeat。不会监听anim1/anim2的动画状态的。

AnimatorSet.Builder函数

//调用AnimatorSet中的play方法是获取AnimatorSet.Builder对象的唯一途径
//表示要播放哪个动画
public Builder play(Animator anim);

//和前面动画一起执行
public Builder with(Animator anim)
//执行前面的动画后才执行该动画
public Builder before(Animator anim)
//执行先执行这个动画再执行前面动画
public Builder after(Animator anim)
//延迟n毫秒之后执行动画
public Builder after(long delay)

play的对象为基准,无论是after还是before。


XML实现

你可能感兴趣的:(6.联合动画:代码和XML实现)