四、ValueAnimator属性动画高级进阶(一)

来源:互联网 发布:mac电子书导入kindle 编辑:程序博客网 时间:2024/06/09 23:23

 1、使用插值器
我们就以BounceInterpolator(弹跳插值器)为例做一个实验,在上一篇的例子基础上在start前加以下代码:

valueAnimator.setInterpolator(new BounceInterpolator());

在执行的时候,我们可以看到动画有了弹跳的效果。

 2、自定义加速器
自定义之前,我们先研究下Interpolator的源码:

public class LinearInterpolatorextends Interpolator{    public LinearInterpolator() {        throw new RuntimeException("Stub!");    }    public LinearInterpolator(Context context, AttributeSetattrs) {        throw new RuntimeException("Stub!");    }    public float getInterpolation(float input) {        throw new RuntimeException("Stub!");    }}public interface Interpolator extends TimeInterpolator {}

LinearInterpolator实现了Interpolator接口;而Interpolator接口则直接继承自TimeInterpolator,而且并没有添加任何其它的方法。 我们再看看TimeInterpolator有哪些方法:

public interface TimeInterpolator {    float getInterpolation(float var1);}

可见TimeInterpolator只有一个函数float getInterpolation(float input),他是干什么的?

参数input:它取值范围是0到1,表示当前动画的进度,取0时表示动画刚开始,取1时表示动画结束,取0.5时表示动画中间的位置,其它类推。

返回值:表示当前实际想要显示的进度。取值可以超过1也可以小于0,超过1表示已经超过目标值,小于0表示小于开始位置。

对于input参数,它表示的是当前动画的进度,匀速增加的。什么叫动画的进度,动画的进度就是动画在时间上的进度,与我们的任何设置无关,随着时间的增长,动画的进度自然的增加,从0到1;input参数相当于时间的概念,我们通过setDuration()指定了动画的时长,在这个时间范围内,动画进度肯定是一点点增加的;就相当于我们播放一首歌,这首歌的进度是从0到1是一样的。

而返回值则表示动画的数值进度,它的对应的数值范围是我们通过ofInt(),ofFloat()来指定的,这个返回值就表示当前时间所对应的数值的进度。

 示例

public class MyTimeInterpolatorimplements TimeInterpolator {    @Override    public float getInterpolation(float v) {        return -v;    }}

给动画valueAnimator添加插值器,会发现,动画的执行方向为左上角方向,与原来的右下角方向反起来了。如果我们进行v/2的操作,我们会发现,动画移动过程中的速度和距离东边为原来的一半;

 3、Evaluator
(1)、概述
我们先来看一张图:
这里写图片描述

这幅图讲述了从定义动画的数字区间到通过AnimatorUpdateListener中得到当前动画所对应数值的整个过程。下面我们对这四个步骤具体讲解一下:

a、ofInt(0,400):表示指定动画的数字区间,是从0运动到400; b、加速器:上面我们讲了,在动画开始后,通过加速器会返回当前动画进度所对应的数字进度,但这个数字进度是百分制的,以小数表示,如0.2 c、Evaluator:我们通过监听器拿到的是当前动画所对应的具体数值,而不是百分制的进度。那么就必须有一个地方会根据当前的数字进度,将其转化为对应的数值,这个地方就是Evaluator;Evaluator就是将从加速器返回的数字进度转成对应的数字值。所以上部分中,我们讲到的公式:当前的值 = 100 + (400 - 100)* 显示进度,这个公式就是在Evaluator计算的;在拿到当前数字进度所对应的值以后,将其返回 d、监听器:我们通过在AnimatorUpdateListener监听器使用animation.getAnimatedValue()函数拿到Evaluator中返回的数字值。 

事实上,Evaluator就是一个转换器,他把小数进度转换成对应的数值位置。

(2)、各种Evaluator

每种定义方式所对应的Evaluator必然是它专用的;Evaluator专用的原因在于动画数值类型不一样,在通过Evaluator返回时会报强转错误;所以只有在动画数值类型一样时,所对应的Evaluator才能通用。所以ofInt()对应的Evaluator类名叫IntEvaluator,而ofFloat()对应的Evaluator类名叫FloatEvaluator;

在设置Evaluator时,是通过animator.setEvaluator()来设置的,比如:

valueAnimator.setEvaluator(new IntEvaluator());

我们就来看看IntEvaluator内部是怎么实现的:

public class IntEvaluatorimplements TypeEvaluator<Integer> {                            //显示进度(百分数),起始值,最终值    publicInteger evaluate(float fraction, Integer startValue, Integer endValue) {        intstartInt = startValue;        return(int)(startInt + fraction * (endValue - startInt))    }}

 3、自定义Evalutor

    public class MyEvaluatorimplements TypeEvaluator<Integer> {        @Override        public Integer evaluate(float v, Integer start, Integer end) {            return (int)(end - v * (end - start)) ;        }    }

这个作用相当于设置Reverse

阅读全文
0 0
原创粉丝点击