动画分为 View Animation
和 Property Animation
(属性动画)
使用ViewPropertyAnimator
可用View已有的属性实现动画,如果多次执行的动画,要注意设置初始值。
tvViewFir.translationX = 0f
tvViewFir.alpha = 1.0f
tvViewFir.animate().translationX(500f).alpha(0f).setDuration(1000).start()
view.animate()
返回的值,就是一个ViewPropertyAnimator
使用ObjectAnimator
ObjectAnimator.ofFloat(tvViewSec, "translationX", 0f, 500f).setDuration(1000).start()
ObjectAnimator.ofFloat(tvViewSec, "alpha", 1.0f, 0f).setDuration(1000).start()
对于多个属性动画同时执行,上述代码片不合理,会执行两次动画值运算。可以使用
PropertyValuesHolder 来实现
private fun multiPropertyAnimal() {
//对于多个属性动画同时执行,使用 PropertyValuesHolder
val translationAnimate = PropertyValuesHolder.ofFloat("translationX", 0f, 500f)
val alphaAnimate = PropertyValuesHolder.ofFloat("alpha", 1.0f, 0f)
ObjectAnimator.ofPropertyValuesHolder(tvViewSec, translationAnimate, alphaAnimate)
.setDuration(1000).start()
}
另外,通过PropertyValuesHolder也可以对一个动画做精确控制。例如,在完成度0.5的时候,进度条到100, 完成度1.0的时候,进度条再到80等.
使用AnimatorSet可以控制动画流。可以实现动画一起播放,先后播放等
val translationAnimate = ObjectAnimator.ofFloat(tvViewSec, "translationX", 0f, 500f).setDuration(1000)
val alphaAnimate = ObjectAnimator.ofFloat(tvViewSec, "alpha", 1.0f, 0f).setDuration(1000)
// 两个动画依次执行
val animatorSet = AnimatorSet()
animatorSet.playSequentially(translationAnimate, alphaAnimate)
animatorSet.start()
值动画,ViewPropertyAnimator
ObjectAnimator
都是在ValueAnimator
的基础上实现的。ObjectAnimator
是它的子类。它是根据完成度,来计算当前值,可以使用当前值,完成不同的动画效果。
val valueAnimator = ValueAnimator.ofFloat(0f, 1.0f)
valueAnimator.addUpdateListener {
val value = it.animatedValue as Float
tvValueAnimator.text = value.toString()
}
valueAnimator.interpolator = AccelerateDecelerateInterpolator()
valueAnimator.duration = 5000
valueAnimator.start()
ViewPropertyAnimator
、ObjectAnimator
、ValueAnimator
这三种 Animator
,它们其实是一种递进的关系:从左到右依次变得更加难用,也更加灵活。但它们的性能是一样的,所以在实际使用时候的选择,只要遵循一个原则就行:尽量用简单的。能用 View.animate()
实现就不用 ObjectAnimator
,能用 ObjectAnimator
就不用 ValueAnimator
.
HenCoder