Android动画之AnimatorSet组合动画

3,209 阅读2分钟

在ObjectAnimator中,因为需要设置属性,比如在scale中,可以使View在X轴或者Y轴缩放,但是如果想要使在X轴和Y轴同时缩放,就需要用到AnimatorSet。 在AnimatorSet中,提供了两个函数,分别是playSequentially和playTogether。前者表示所有的动画依次执行,后者表示所有的动画同时执行。

必须想要两个动画依次执行:

val objectAnimator1:ObjectAnimator = ObjectAnimator.ofFloat(textview,"alpha",1f,0f,1f)
val objectAnimator = ObjectAnimator.ofFloat(textview,"scaleX",1f,4f,1f)

AnimatorSet().apply {
    duration = 2000
    playSequentially(objectAnimator1,objectAnimator)
}.start()

Untitled.gif

同时执行:

val objectAnimator1:ObjectAnimator = ObjectAnimator.ofFloat(textview,"alpha",1f,0f,1f)
val objectAnimator = ObjectAnimator.ofFloat(textview,"scaleX",1f,4f,1f)
AnimatorSet().apply {
    duration = 2000
    playTogether(objectAnimator1,objectAnimator)
}.start()

Filmage 2022-01-23_201522.gif

总结: playSequentially和palyTogether函数在开始动画时,只负责把每个控件的动画激活,至于控件自身的动画是否超时,是否无限循环,只与控件自身的动画设定有关,这两个函数只负责到时间后激活动画。

如果我们想实现这样一组动画,有三个动画A、B、C,我们想先播放A,然后同时播放B和C,用以上的两个函数就无法实现,此时我们就需要用到AnimatorSet.Builder。

一下代码可实现以上的要求,先让View做渐隐渐现动画,然后同时进行旋转以及缩放动画。

val objectAnimator1:ObjectAnimator = ObjectAnimator.ofFloat(textview,"alpha",1f,0f,1f)
val objectAnimator2:ObjectAnimator = ObjectAnimator.ofFloat(textview,"rotation",0f,180f,360f)
val objectAnimator3:ObjectAnimator = ObjectAnimator.ofFloat(textview,"scaleX",1f,4f,1f)
val animatorSet = AnimatorSet()
animatorSet.play(objectAnimator1).apply {
    before(objectAnimator2)
    before(objectAnimator3)
}
animatorSet.duration = 2000
animatorSet.start()

Untitled.gif

以下是AnimatorsSet.Builder中的一些方法:

  • play 表示播放哪个动画
  • with 表示和前面的动画一起执行
  • before 表示在播放before中指定的动画之前先播放play中的动画
  • after 表示先播放after中的动画,再播放play中指定的动画。

参考资料《Android自定义控件开发与实战》