动画之插值器和估值器

概念

插值器

  • 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(插值器)根据时间流逝的百分比计算出当前属性值改变的百分比,并且 插值器 将这个百分比返回,这个时候 插值器 的工作就完成了;这就需要 估值器 根据当前属性改变的百分比来计算改变后的属性值,根据这个属性值,我们就可以设置当前属性的值了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值