程序员Android开发Android技术知识

Android动画系列——TypeEvaluator和Inter

2019-01-17  本文已影响24人  zackyG

Interpolator

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


image.png

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

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/

上一篇 下一篇

猜你喜欢

热点阅读