Android动画系列——TypeEvaluator和Inter
Interpolator
从字面来看,它叫插值器,在Android里面也被叫做时间插值器,因为Interpolator接口继承制TimeInterpolator接口,官方对它的定义是An interpolator defines the rate of change of an animation。在View动画和属性动画中,都可以设置Interpolator。你给动画设置不同的 Interpolator ,动画就会以不同的速度模型来执行。Android系统为我们预置了一些常见的速度模型的Interpolator。继承关系如下图所示:
image.png
下面结合简单的动图,介绍下常见的Interpolator
-
AccelerateDecelerateInterpolator 先加速后减速,这也是动画默认的Interpolator
AccelerateDecelerateInterpolator
图示好像还是不够直观,其实就是物体从速度为0开始加速,然后再减速到0的过程。最符合物理世界的模型。
-
LinearInterpolator 匀速。
LinearInterpolator -
AccelerateInterpolator 初始速度为0,持续加速。它主要用在离场效果中,比如某个物体从界面中飞离,就可以用这种效果。它给人的感觉就会是「这货从零起步,加速飞走了」。到了最后动画骤停的时候,物体已经飞出用户视野,看不到了,所以他们是并不会察觉到这个骤停的。
AccelerateInterpolator -
DeccelerateInterpolator 初始速度很大,持续减速到速度为0。它的效果和上面这个 AccelerateInterpolator 相反,适用场景也和它相反:它主要用于入场效果,比如某个物体从界面的外部飞入界面后停在某处。它给人的感觉会是「咦飞进来个东西,让我仔细看看,哦原来是 XXX」。
DeccelerateInterpolator -
AnticipateInterpolator 先回拉一下再进行正常动画轨迹。效果看起来有点像投掷物体或跳跃等动作前的蓄力。如果是平移动画,那么就是位置上的回拉;如果是放大动画,那么就是先缩小一下再放大;其他类型的动画同理。
AnticipateInterpolator -
OvershootInterpolator 动画会超过目标值一些,然后再弹回来。
OvershootInterpolator -
AnticipateOvershootInterpolator 上面这两个的结合版:开始前回拉,最后超过一些然后回弹。
AnticipateOvershootInterpolator -
BounceInterpolator 在目标值处弹跳。有点像玻璃球掉在地板上的效果。
BounceInterpolator -
CycleInterpolator 这个也是一个正弦 / 余弦曲线,不过它和 AccelerateDecelerateInterpolator 的区别是,它可以自定义曲线的周期,所以动画可以不到终点就结束,也可以到达终点后回弹,回弹的次数由曲线的周期决定,曲线的周期由 CycleInterpolator() 构造方法的参数决定。下面两个图分别是参数为0.5f和2f的演示效果
CycleInterpolator(0.5f)
CycleInterpolator(2f)
PathInterpolator
自定义速度模型的Interpolator。用这个 Interpolator 你可以定制出任何你想要的速度模型。定制的方式是使用一个 Path 对象来绘制出你要的动画完成度 / 时间完成度曲线。例如:
Path linearPath = new Path();
linearPath.lineTo(1,1);
PathInterpolator customLinearInterpolator = new PathInterpolator(linearPath);
Path interpolatorPath = new Path();
// 先以「动画完成度 : 时间完成度 = 1 : 1」的速度匀速运行 25%
interpolatorPath.lineTo(0.25f, 0.25f);
// 然后瞬间跳跃到 150% 的动画完成度
interpolatorPath.moveTo(0.25f, 1.5f);
// 再匀速倒车,返回到目标点
interpolatorPath.lineTo(1, 1);
PathInterpolator customInterpolator = new PathInterpolator(interpolatorPath);
以上就是常见的Interpolator。还有一些系统预置的Interpolator,没有逐一列出。
TypeEvaluator
TypeEvaluator,类型估值器,只能在属性动画设置,对于View动画是不需要的。其作用是根据属性值改变的百分比,计算出改变后的属性值。因为不同的属性,其值的类型也不同。因此Android预置了一些常见类型的估值器来操作不同类型的属性值,常见的类型估值器继承关系如下:
TypeEvaluator及其子类
借助于 TypeEvaluator,属性动画就可以通过 ofObject() 来对不限定类型的属性做动画了。这也是TypeEvaluator比较典型的用法。以下是一个简单的实例
class CharEvaluator implements TypeEvaluator<Character> {
@Override
public Character evaluate(float fraction, Character startValue, Character endValue) {
int start = (int)startValue;
int end = (int)endValue;
int current = (int)(start + (end - start)*fraction);
return (char)current;
}
}
Keyframe frame0 = Keyframe.ofObject(0f, new Character('A'));
Keyframe frame1 = Keyframe.ofObject(0.1f, new Character('O'));
Keyframe frame2 = Keyframe.ofObject(1,new Character('Z'));
PropertyValuesHolder holder = PropertyValuesHolder.ofKeyframe("CharText",frame0,frame1,frame2);
holder.setEvaluator(new CharEvaluator());
ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(new ViewWrapper(intentBtn),holder);
animator.setDuration(3000);
animator.start();
本文参考:
https://www.jianshu.com/p/b117c974deaf
https://hencoder.com/ui-1-6/
https://hencoder.com/ui-1-7/