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() 方法执行动画。

对于多个属性动画同时执行,上述代码片不合理,会执行两次动画值运算。可以使用
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 = it.animatedValue as Float
        tvValueAnimator.text = value.toString()
    }
    valueAnimator.interpolator = AccelerateDecelerateInterpolator()
    valueAnimator.duration = 5000
    valueAnimator.start()

综述

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

参考资料

HenCoder

你可能感兴趣的:(Android学习,Android笔记)