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

本学习笔记来自启舰的:
http://blog.csdn.net/harvic880925/article/details/50546884

 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值