Interpolator与Evaluator

这两个概念是动画中的,而且后者是属性动画中的内容,关于他们的讨论我们就放在属性动画来说,在之前我们通常学习的是Interpolator ,它的中文名叫做插值器,主要是定义动画表现形式的一种方式,更详细的说是动画执行的物理体现。

Interpolator

比如说 AccelerateInterpolator所给的表现是动画越来越快,相反DecelerateInterpolator是运行越来越慢的动画。
系统提供了很多插值器,比如说弹簧,反弹,加速,减速,加减速等,当然也可以自己定义插值器。

简单的定义插值器的方式是实现TimeInterpolator接口,通过提供自己的数学表达式来实现数据的插值变化, 这个接口中只有一个方法,实现它即可。

可以看到下面这段代码我简单的用1 - v,这里的v就是输入,return的就是处理后的值。

public class MyInterpolator implements TimeInterpolator {
    @Override
    public float getInterpolation(float v) {
        return 1 - v;
    }
}

举个简单的例子,如果我要实现一个加速插值器,先看一下系统实现的加速度插值器的曲线


Interpolator与Evaluator_第1张图片

那么在代码中的v就是x轴值,返回值就是y轴值,有点数学函数基础的都会知道下一步就是 找到 f(x)关系,观察曲线,发现f越大曲线越凹,我们可以采用幂函数来实现 如f = 1.5 则 f(x) = x ^ 1.5 ,表示成代码就是

 return (float) Math.pow(v,1.5);

此时这个1.5可以写死,也可由构造函数传进来,那么如果你理解了这个,要实现一个正弦图像的就可以用Math.sin(v)这个方式了。

Interpolator与Evaluator_第2张图片

这里需要注意的是,如果f(x)的定义域是0-1,但是值域并不一定是0-1,比如说弹簧插值器,先越过1到达x(>1)某个值,然后再减为1,这些都是有可能的。

最后,x和y都是标识的是动画进度值。

Evaluator

在说完插值器之后,再来接触一个Evaluator(估值器)的概念,暂且不管这些乱七八糟的名字,可以直接看这个东西的用处。

Interpolator与Evaluator_第3张图片

Evaluator是在Interpolator之后运行的,作用是把后者提供的百分比跟输入的起始和结束值进行运算,得到真正的输出值。

说白了如果当前 Interpolator 返回了 0.2 那么 此时的进度值就应该是(200 - 0) x 0.2 + 0,说白了核心不仅仅是Interpolator,Evaluator也发挥了至关重要的作用。

重点提示是:Evaluator是按照类型来实现的,里面有严格的泛型要求,下面是我实现的一个

public class MyEvaluator implements TypeEvaluator {
    
    @Override
    public Float evaluate(float v, Float s, Float e) {
        return (200 + s + v * (e - s));
    }
}

可以看到在初始化的时候,我就传入了Float作为全局的类型,于是evaluate方法所有的值都是Float值,那么在外边使用的时候也必须应用在float场景,否则就会报转型错误。
关注一下evaluate方法,其中v也就是在插值器一节说的进度值(y轴),s是动画初始化的时候,ofInt或者ofFloat方法传入的值。

这个公式跟我们上面所说的(200 - 0) x 0.2 + 0是类似的,只不过代码公式里加了个200,那么最终表现形式就是200 - 400值的显示。

关于属性动画,在这里不在多说了,后面会有一些关于属性动画进阶的内容。

你可能感兴趣的:(Interpolator与Evaluator)