前言
最近想学的东西有点多...(潜台词:一个也没学~哈哈)待我学成之后,再出来“装逼”...
今天整一篇“科普”向的文章,也是我自己一直傻傻分不清的内容:插值器、估值器。
正文
一、插值器Interpolator
什么是插值器?
根据时间流失的百分比 计算当前属性改变的百分比。
使用场景:实现非线性运动的动画效果
非线性运动:动画改变的速率不是一成不变的,如加速 & 减速运动都属于非线性运动
动画是我们日常工作中不可缺少的一点。如果我们稍加注意就发发现默认的的动画都是线性的,而一旦需求有所变动,比如需要一个加速度效果的动画。此时插值器的作用就出现了。
TimeInterpolator
TimeInterpolator接口是属性动画中新增的,用于兼容Interpolator接口,因此以后如果自定义插值器直接使用TimeInterpolator就可以了。
TimeInterpolator接口就一个方法.其中方法中的input表示时间流逝的百分比, teturn意味着我们自己算法下的属性改变的百分比。
public interface TimeInterpolator {
float getInterpolation(float input);
}
系统内置的插值器如下:
作用 | 资源ID | 对应的Java类 |
---|---|---|
默认的匀速 | @android:anim/linear_interpolator | LinearInterpolator |
逐渐加速 | @android:anim/accelerate_interpolator | AccelerateInterpolator |
先加速再减速 | @android:anim/accelerate_decelerate_interpolator | AccelerateDecelerateInterpolator |
先退后再加速前进 | @android:anim/anticipate_interpolator | AnticipateInterpolator |
周期运动 | @android:anim/cycle_interpolator | CycleInterpolator |
动画结束时抖动,类似皮球自由落体 | DecelerateInterpolator | |
快速完成动画,超出再回到结束点 | @android:anim/overshoot_interpolator | OvershootInterpolator |
开始的时候向后甩一点,然后向前 | @android:anim/anticipate_overshoot_interpolator | AnticipateOvershootInterpolator |
自定义插值器
V4包中增加了LookupTableInterpolator、FastOutLinearInInterpolator、FastOutSlowInInterpolator、LinearOutSlowInInterpolator如果系统内置的插值器不能满足动画需求可以自定义插值器
自定义插值器
- 本质:根据动画的进度(0%-100%)计算出当前属性值改变的百分比。以怎样的变化规律实现可以参考系统内置的插值器实现或者直接使用上面👆提到的网站生成
- 具体使用:自定义插值器需要实现Interpolator / TimeInterpolator接口 & 复写getInterpolation();ttmain中EaseCubicInterpolator就是自定义插值器,相对比较简单
//弹性插值器
public class SpringInterpolator implements TimeInterpolator {
private float factor;//参数因子
public SpringInterpolator(float factor) {
this.factor = factor;
}
// 复写getInterpolation()
@Override
public float getInterpolation(float input) {
return (float) (Math.pow(2, -10 * input)
* Math.sin((input - factor / 4)
* (2 * Math.PI) / factor) + 1);
}
}
二、估值器Evaluator
什么是估值器:根据当前属性改变的百分比来计算改变后的属性值。
插值器决定属性值随时间变化的规律;而具体变化属性数值则交给估值器去计算。
TypeEvaluator
一个允许自定义估值器的类接口,实现evaluator()
,其中:
- fractio参数:动画完成度,也就是插值器
getInterpolation()
的返回,代表当前属性值改变的百分比 - startValue参数:动画的初始值
- endValue参数:动画的结束值
public interface TypeEvaluator<T> {
public T evaluate(float fraction, T startValue, T endValue);
}
系统内置的实现类
- IntEvaluator Int类型估值器,返回int类型的属性改变
- FloatEvaluator Float类型估值器,返回Float类型属性改变
- ArgbEvaluator 颜色类型估值器,返回16进制颜色值
自定义估值器
本质:根据插值器计算出当前属性值改变的百分比 & 初始值 & 结束值 来计算此刻属性变化的具体值;
自定义估值器很简单,这里举个匀速估值器的例子:动画进行了50%(初始值=100,结束值=200 ),那么匀速插值器计算出了当前属性值改变的百分比是50%,那么估值器则负责计算当前属性值 = 100 + (200-100)x50% = 150。
这里随便整段代码,大家感受一下就好了。如果需求上需要自定义估值器,方法实现需要自己根据业务去调整。
// 实现TypeEvaluator接口
public class PointEvaluator implements TypeEvaluator<Point> {
// 复写evaluate()
// 在evaluate()里写入对象动画过渡的逻辑
@Override
public Point evaluate(float fraction, Point startValue, Point endValue) {
// 根据fraction来计算当前动画的x和y的值
int x = (int) (startValue.x + fraction * (endValue.x - startValue.x));
int y = (int) (startValue.y + fraction * (endValue.y - startValue.y));
// 将计算后的坐标封装到一个新的Point对象中并返回
return new Point(x, y);
}
}
三、总结
插值器和估值器关系
属性动画是对属性做动画,属性要实现动画。
- 1、首先由插值器根据时间流逝的百分比计算出当前属性值改变的百分比,然后由插值器将这个百分比返回。这个时候插值器的工作就完成了。
比如 插值器 返回的值是0.5,很显然我们要的不是0.5
- 插值器算好属性变化百分比之后,由估值器根据当前属性改变的百分比来计算改变后的属性值,根据这个属性值,我们就可以对View设置当前的属性值了。
尾声
OK,关于插值器和估值器我想聊的就是这么多,很简单很简单的内容。就当日常查缺补漏,碎片时间下的一点点提升吧~~