Android学习|android 动画总结

动画分为 View AnimationProperty 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()

  1. 如果是自定义控件,需要添加 setter / getter 方法。
  2. 用 ObjectAnimator.ofXXX() 创建ObjectAnimator 对象。
  3. 用 start() 方法执行动画。
【Android学习|android 动画总结】对于多个属性动画同时执行,上述代码片不合理,会执行两次动画值运算。可以使用
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()

ValueAnimator 值动画,ViewPropertyAnimator ObjectAnimator都是在ValueAnimator的基础上实现的。ObjectAnimator是它的子类。它是根据完成度,来计算当前值,可以使用当前值,完成不同的动画效果。
val valueAnimator = ValueAnimator.ofFloat(0f, 1.0f) valueAnimator.addUpdateListener { val value = https://www.it610.com/article/it.animatedValue as Float tvValueAnimator.text = value.toString() } valueAnimator.interpolator = AccelerateDecelerateInterpolator() valueAnimator.duration = 5000 valueAnimator.start()

综述 ViewPropertyAnimatorObjectAnimatorValueAnimator 这三种 Animator,它们其实是一种递进的关系:从左到右依次变得更加难用,也更加灵活。但它们的性能是一样的,所以在实际使用时候的选择,只要遵循一个原则就行:尽量用简单的。能用 View.animate() 实现就不用 ObjectAnimator,能用 ObjectAnimator 就不用 ValueAnimator.
参考资料 HenCoder

    推荐阅读