Android动画系列——TypeEvaluator和Interpolator

Interpolator

从字面来看,它叫插值器,在Android里面也被叫做时间插值器,因为Interpolator接口继承制TimeInterpolator接口,官方对它的定义是An interpolator defines the rate of change of an animation。在View动画和属性动画中,都可以设置Interpolator。你给动画设置不同的 Interpolator ,动画就会以不同的速度模型来执行。Android系统为我们预置了一些常见的速度模型的Interpolator。继承关系如下图所示:

《Android动画系列——TypeEvaluator和Interpolator》 image.png

下面结合简单的动图,介绍下常见的Interpolator

  • AccelerateDecelerateInterpolator 先加速后减速,这也是动画默认的Interpolator

    《Android动画系列——TypeEvaluator和Interpolator》 AccelerateDecelerateInterpolator

    图示好像还是不够直观,其实就是物体从速度为0开始加速,然后再减速到0的过程。最符合物理世界的模型。

  • LinearInterpolator 匀速。

    《Android动画系列——TypeEvaluator和Interpolator》 LinearInterpolator

  • AccelerateInterpolator 初始速度为0,持续加速。它主要用在离场效果中,比如某个物体从界面中飞离,就可以用这种效果。它给人的感觉就会是「这货从零起步,加速飞走了」。到了最后动画骤停的时候,物体已经飞出用户视野,看不到了,所以他们是并不会察觉到这个骤停的。

    《Android动画系列——TypeEvaluator和Interpolator》 AccelerateInterpolator

  • DeccelerateInterpolator 初始速度很大,持续减速到速度为0。它的效果和上面这个 AccelerateInterpolator 相反,适用场景也和它相反:它主要用于入场效果,比如某个物体从界面的外部飞入界面后停在某处。它给人的感觉会是「咦飞进来个东西,让我仔细看看,哦原来是 XXX」。

    《Android动画系列——TypeEvaluator和Interpolator》 DeccelerateInterpolator

  • AnticipateInterpolator 先回拉一下再进行正常动画轨迹。效果看起来有点像投掷物体或跳跃等动作前的蓄力。如果是平移动画,那么就是位置上的回拉;如果是放大动画,那么就是先缩小一下再放大;其他类型的动画同理。

    《Android动画系列——TypeEvaluator和Interpolator》 AnticipateInterpolator

  • OvershootInterpolator 动画会超过目标值一些,然后再弹回来。

    《Android动画系列——TypeEvaluator和Interpolator》 OvershootInterpolator

  • AnticipateOvershootInterpolator 上面这两个的结合版:开始前回拉,最后超过一些然后回弹。

    《Android动画系列——TypeEvaluator和Interpolator》 AnticipateOvershootInterpolator

  • BounceInterpolator 在目标值处弹跳。有点像玻璃球掉在地板上的效果。

    《Android动画系列——TypeEvaluator和Interpolator》 BounceInterpolator

  • CycleInterpolator 这个也是一个正弦 / 余弦曲线,不过它和 AccelerateDecelerateInterpolator 的区别是,它可以自定义曲线的周期,所以动画可以不到终点就结束,也可以到达终点后回弹,回弹的次数由曲线的周期决定,曲线的周期由 CycleInterpolator() 构造方法的参数决定。下面两个图分别是参数为0.5f和2f的演示效果

    《Android动画系列——TypeEvaluator和Interpolator》 CycleInterpolator(0.5f)
    《Android动画系列——TypeEvaluator和Interpolator》 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预置了一些常见类型的估值器来操作不同类型的属性值,常见的类型估值器继承关系如下:

《Android动画系列——TypeEvaluator和Interpolator》 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/

    原文作者:zackyG
    原文地址: https://www.jianshu.com/p/0c18fde5825a
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞