概念
插值器
- 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(插值器)根据时间流逝的百分比计算出当前属性值改变的百分比,并且 插值器 将这个百分比返回,这个时候 插值器 的工作就完成了;这就需要 估值器 根据当前属性改变的百分比来计算改变后的属性值,根据这个属性值,我们就可以设置当前属性的值了。
扫描二维码关注公众号,回复:
12573167 查看本文章