在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()
同时执行:
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()
总结: 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()
以下是AnimatorsSet.Builder中的一些方法:
- play 表示播放哪个动画
- with 表示和前面的动画一起执行
- before 表示在播放before中指定的动画之前先播放play中的动画
- after 表示先播放after中的动画,再播放play中指定的动画。
参考资料《Android自定义控件开发与实战》