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/
来源: http://www.jianshu.com/p/0c18fde5825a