属性动画整理的脑图如下:

属性动画

基本使用

ValueAnimator

ValueAnimator是整个属性动画机制当中最核心的一个类,属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。它的内部使用一种时间循环的机制来计算值与值之间的动画过渡,我们只需要将初始值和结束值提供给ValueAnimator,并且告诉它动画所需运行的时长,那么ValueAnimator就会自动帮我们完成从初始值平滑地过渡到结束值这样的效果。除此之外,ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等,确实是一个非常重要的类。

 ValueAnimator.ofXXX(0f, 100f, 50f, 100f)
       .apply {
          duration = 300
          addUpdateListener {
          // ...
       }
  }.start()

ps:ofXXX代表数值类型,可以是ofIntofFloat等。

ObjectAnimator

ObjectAnimator继承自ValueAnimator, ValueAnimator是对值进行了一个平滑的动画过渡,而ObjectAnimator 可以直接对任意对象的任意属性进行动画操作的,比如说View的alpha属性。

// 设置imageView的透明度属性
ObjectAnimator.ofFloat(imageView, "alpha", 1.0f, 0.4f, 1.0f)
    .apply {
        duration = 1000
        startDelay = 300
    }.start()

PropertyValuesHolder

PropertyValuesHolder对象可用于通过ValueAnimatorObjectAnimator创建动画,这些动画可以并行操作多个不同的属性。

val holder1 = PropertyValuesHolder.ofFloat("alpha", 1f, 0.5f)
val holder2 = PropertyValuesHolder.ofFloat("scaleX", 1f, 0.5f)
val holder3 = PropertyValuesHolder.ofFloat("scaleY", 1f, 0.5f)
val animator: ObjectAnimator =
        ObjectAnimator.ofPropertyValuesHolder(binding.imgIv, holder1, holder2, holder3)
animator.duration = 200
animator.start()

TypeEvaluator

通过ValueAnimator#setEvaluator()方法设置估值器,TypeEvaluator能够支持我们创建支持任意属性类型的动画。

系统内置了一些估值器:

ArgbEvaluator, FloatArrayEvaluator, FloatEvaluator, IntArrayEvaluator, IntEvaluator, PointFEvaluator, RectEvaluatorTypeEvaluator

我们也可以自定义,如下:

ValueAnimator().apply {
    duration = 3000
    setObjectValues(PointF(0f, 0f))
    interpolator = AccelerateInterpolator(10f)
    val point = PointF()
    //自定义估值器
    setEvaluator { fraction, startValue, endValue ->
                  point.x = 100f * (fraction * 5)
                  // y=vt=1/2*g*t*t(重力计算)
                  point.y = 0.5f * 98f * (fraction * 5) * (fraction * 5)
                  point
                 }
    addUpdateListener {
        val p = it.animatedValue as PointF
        imageView.apply {
            x = p.x
            y = p.y
        }
    }
}.start()

Interpolator

Interpolator被用于定义动画的变化速率。也可以说是加速度。系统自带了一些插值器如下:

  • AccelerateDecelerateInterolator:先加速后减速
  • AccelerateInterpolator:加速
  • DecelerateInterpolator:减速
  • AnticipateInterpolator:先向相反方向改变一段再加速播放
  • AnticipateOvershootInterpolator:先向相反方向改变,再加速播放,会超出目标值然后缓慢移动至目标值,类似于弹簧回弹
  • BounceInterpolator:快到目标值时值会跳跃
  • CycleIinterpolator:动画循环一定次数,值的改变为一正弦函数:Math.sin(2 * mCycles * Math.PI)
  • LinearInterpolator:线性均匀改变
  • OvershottInterpolator:最后超出目标值然后缓慢改变到目标值
  • TimeInterpolator:一个允许自定义Interpolator的接口,以上都实现了该接口

都是通过:
valueAnimator.setInterpolator(new LinearInterpolator());
设置即可。

ValueAnimator().apply {
    duration = 3000
    setObjectValues(PointF(0f, 0f))
    interpolator = AccelerateInterpolator(10f)
}.start()

AnimatorSet

AnimatorSet是对属性动画的一个集合,可以让很多动画按一定顺序或者 同时进行。

val translationXAnimator = ObjectAnimator.ofFloat(binding.imgIv, "translationX", 0f, 500f)
val alphaAnimator = ObjectAnimator.ofFloat(binding.imgIv, "alpha", 0f, 1f)
val scaleXAnimator = ObjectAnimator.ofFloat(binding.imgIv, "scaleX", 0f, 2f)

val animatorSet = AnimatorSet()
animatorSet.duration = 500

// 按照顺序执行
// animatorSet.playSequentially(translationXAnimator, alphaAnimator, scaleXAnimator)
// 一起执行
// animatorSet.playTogether(translationXAnimator, alphaAnimator, scaleXAnimator)
// 链式调用
// animatorSet.play(translationXAnimator).with(alphaAnimator).with(scaleXAnimator)
// after 在 play之前执行  before 在 play之后执行
animatorSet.play(translationXAnimator).after(scaleXAnimator).before(alphaAnimator)
animatorSet.start()

实战

xiaow/AndroidPractiseCode: Android 代码练习库 - Gitee.com

动画框架

xiaow/AndroidPractiseCode: Android 代码练习库 - Gitee.com