本学习笔记来自启舰的:
http://blog.csdn.net/harvic880925/article/details/50549385
ofObject()概述
ofInt()只能传入Integer类型的值,而ofFloat()则只能传入Float类型的值。那如果我们需要操作其它类型的变量要怎么办呢?其实ValueAnimator还有一个函数ofObject(),可以传进去任何类型的变量,定义如下:
public static ValueAnimatorofObject(TypeEvaluator evaluator, Object... values);
它有两个参数,第一个是自定义的Evaluator,第二个是Object类型的可变长参数;为什么要强制传进去自定义的Evaluator?首先,大家知道Evaluator的作用是根据当前动画的显示进度,计算出当前进度下对应的值。那既然Object对象是我们自定的,那必然从进度到值的转换过程也必须由我们来做,不然系统哪知道你要转成个什么鬼。
先看看例子:
public class MyCharsEvaluatorimplements TypeEvaluator<Character> {
@Override
public Character evaluate(float v, Character characterStart, Character characterEnd) {
intstart = (int)characterStart;
intend = (int)characterEnd;
intresult = (int)(start + v*(end - start));
char cha = (char)result;
return cha;
}
}
在Activity中:
mValueAnimator= mValueAnimator.ofObject(new MyCharsEvaluator(),
new Character('A'), new Character('Z'));
mValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimatorvalueAnimator) {
char value = (char) valueAnimator.getAnimatedValue();
mTvTestObject.setText("设置新的value值:" + value);
}
});
mValueAnimator.setDuration(2000);
mValueAnimator.setInterpolator(new AccelerateInterpolator());
mValueAnimator.start();
在这里,我们就利用A-Z字符在ASCII码表中对应数字是连续且递增的原理,先求出来对应字符的数字值,然后再转换成对应的字符。