动画之插值器和估值器

概念

插值器

  • TimeInterpolator(时间插值器)

根据时间流逝的百分比计算出当前属性值改变的百分比

  • LinearInterpolator(线性插值器)

用于匀速动画

  • AccelerateDecelerateInterpolator(加速减速插值器)

动画两头慢,中间快

  • DecelerateInterpolator(减速插值器)

动画越来越慢

还有其他系统内置插值器:CycleInterpolator(周期运动)、BounceInterpolator(最后阶段弹球效果)、OvershootInterpolator(快速完成动画,超出再回到结束样式)、AnticipateInterpolator(先退后再加速前进)、AnticipateOvershootInterpolator(先退后再加速前进,超出终点后再回终点)

估值器

类型估值算法,即估值器。 根据当前属性改变的百分比来计算改变后的属性值。系统已有的估值器:IntEvaluator(针对整型属性 )、FloatEvaluator(针对浮点型属性 )、ArgbEvaluator(针对Color属性)

实操

自定义插值器

自定义插值器需要实现 Interpolator / TimeInterpolator接口,复写getInterpolation()方法。补间动画 实现 Interpolator接口;属性动画实现TimeInterpolator接口。

public interface Interpolator { 
   float getInterpolation(float input) {  
        // input值值变化范围是0-1,且随着动画进度(0% - 100% )均匀变化,即动画开始时,input值 = 0;动画结束时input = 1
        // 而中间的值则是随着动画的进度(0% - 100%)在0到1之间均匀增加
       return float型值;
   }
}
TimeInterpolator 接口同上

实例

定义一个减速加速插值器

// 减速加速插值器
class DecelerateAccelerateInterpolator : TimeInterpolator {
    override fun getInterpolation(input: Float): Float {
        return if (input < 0.5) (sin(Math.PI * input) / 2f).toFloat() else ((2 - sin(Math.PI * input)) / 2f).toFloat()
    }
}

// activity 中具体实现
private fun interlatorAni() {
        val animator = ObjectAnimator.ofFloat(tv_interpolator, "translationX", tv_interpolator.translationX,300f,tv_interpolator.translationX)
        animator.duration = 3000
        animator.interpolator = DecelerateAccelerateInterpolator()
        animator.start()
}

自定义估值器

TypeEvaluator 接口并且复写 evaluate()方法

public interface TypeEvaluator<T> {
   // fraction 代表时间流逝的百分比
   public T evaluate(float fraction, T startValue, T endValue);
}

实例

定义一个抛物线 轨迹 估值器

// 建Point类用来保存坐标信息,Point对象即是我们要操作的对象
data class Point(val x: Float, val y: Float)

// 自定义估值算法 PointTypeEvaluator并制定泛型为Point类型,
// 在 evaluate方法 中进行估值算法,为point对象的x和y赋值并将该对象返回
class PointTypeEvaluator : TypeEvaluator<Point> {
    override fun evaluate(fraction: Float, startValue: Point?, endValue: Point?): Point {
        // fraction 代表时间流逝的百分比
        val x = startValue?.x?.plus(fraction * (endValue?.x!!.minus(startValue.x)))
        val y = startValue?.y?.plus(fraction * (endValue?.y!!.minus(startValue.y)))
        return Point(x!!, y!!)
    }
}

// activity 中具体实现
 private fun clickLine() {
 
       // 调用 ValueAnimator.ofObject() 方法获得 ValueAnimator 对象,并传入 自定义估值器对象 和 Point的初始对象与终止对象
        val animator = ValueAnimator.ofObject(PointTypeEvaluator(), Point(0f, 0f), Point(300f, 300f))
        animator.duration = 3000
        
        // 线性插值器
        animator.interpolator = LinearInterpolator()
        
        // 设置 AnimatorUpdateListener 监听
        animator.addUpdateListener { ValueAnimator ->
            //可获得在估值算法中返回的Point对象,并为小球设置新的x和y值
            val point = ValueAnimator.animatedValue as Point
            iv_ball.x = point.x
            iv_ball.y = point.y
        }
        animator.start()
    }

小结

TimeInterpolator和TypeEvaluator是实现 非匀速动画 的重要手段。属性动画是对属性做动画,属性要实现动画,首先由TimeInterpolator(插值器)根据时间流逝的百分比计算出当前属性值改变的百分比,并且 插值器 将这个百分比返回,这个时候 插值器 的工作就完成了;这就需要 估值器 根据当前属性改变的百分比来计算改变后的属性值,根据这个属性值,我们就可以设置当前属性的值了。

猜你喜欢

转载自blog.csdn.net/xufei5789651/article/details/101068494