android动画用到的算法,Android动画(三)之插值器和估值器

TimerInterpolator中文翻译为时间插值器,它的作用是根据时间的流逝的百分比来计算出当前属性值改变的百分比,系统预置的有LinearInterpolator(线性插值器:匀速动画)、AccelerateDecelerateInterpolator(加速减速插值器:动画两头慢中间快)和DecelerateInterpolator(减速插值器:动画越来越慢)等。

TypeEvaluator的中文翻译为类型估值算法,也叫估值器,它的作用是根据当前属性改变的百分比来计算改变后的属性值,系统预置的有IntEvaluator(针对整型属性)、FloatEvaluator(针对浮点型数据)和ArgbEvaluator(针对Color属性)。

属性动画中的插值器(Interpolator)和估值器(TypeEvalutor)很重要,它们是实现非匀速动画的重要手段,下面通过一个实例来加强理解。

如下图所示,它表示一个匀速动画,采用了线性插值器和整型估值算法,在40ms内,View的x属性实现从0到40的变换。

fec731192995

插值器的工作原理

由于动画的默认刷新率为10ms/帧,所以该动画将分5帧进行,我们来考虑第三帧(x=20,t=20ms),当时间t=20ms时,时间流逝的百分比 是0.5(20/40=0.5),意味着现在时间过了一半,那么x的值就应该由插值器和估值算法来确定。拿线性插值器来说,当时间过了一半,x的变换也应该是一半,因为它实现的是匀速动画,下面是它的源码:

@HasNativeInterpolator

public class LinearInterpolator extends BaseInterpolator implements NativeInterpolatorFactory {

public LinearInterpolator() {

}

public LinearInterpolator(Context context, AttributeSet attrs) {

}

public float getInterpolation(float input) {

return input;

}

/** @hide */

@Override

public long createNativeInterpolator() {

return NativeInterpolatorFactoryHelper.createLinearInterpolator();

}

}

很显然,线性插值器的返回值和输入值一样,因此插值器返回的值是0.5,这意味着x的改变就是0.5,这个时候插值器的工作就完成了。具体x变成了什么值,这个需要估值算法来确定,下面是估值算法的源码:

public class IntEvaluator implements TypeEvaluator {

public Integer evaluate(float fraction, Integer startValue, Integer endValue) {

int startInt = startValue;

return (int)(startInt + fraction * (endValue - startInt));

}

}

上述算法很简单,evaluate的三个参数分别表示估值小数、开始值和结束值,对应于上面的例子就分别是0.5、0、4。根据上述算法,整形估值返回给我们的结果是20,这就是(x=20,t=20ms)的由来。

属性动画要求对象的该属性有set方法和get方法(可选)。插值器和估值算法除了系统提供的外,我们还可以自定义。实现方式也很简单,因为插值器和估值算法都是一个接口,且内部都只有一个方法,我们只要派生一个类实现接口就可以了,然后就可以做出千奇百怪的动画效果了。具体一点就是:自定义插值器需要实现Interpolator或者TimeInterpolator,自定义估值算法需要实现TypeEvaluator。另外就是如果要对其他类型(非int,float,Color)做动画,那么必须要自定义类型估值算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值