ValueAnimator是之前提到过的ObjectAnimator的父类;
它使用起来不像ObjectAnimator这么简单,但可控性更高,更能发挥想象力;
一般来说,使用ValueAnimator需要通过以下几步;
- setObjectValues
- setEvaluator
- addUpdateListener
- setDuration
- start
public void setObjectValues(Object... values) | 设置一组值,动画会根据这组值执行; 不同于ObjectAnimator,这里的参数不能只有一个值; 注意,这里参数是Object,这就给了很大的想象空间; |
void setEvaluator(TypeEvaluator value) | 设置求值程序; TypeEvaluator 是一个接口; public interface TypeEvaluator<T> { public T evaluate(float fraction, T startValue, T endValue); } 通过evaluate方法返回对应的值; 真个动画过程中evaluate方法会被调用很多次,直到动画播放结束; |
void addUpdateListener(AnimatorUpdateListener listener) | 主要是AnimatorUpdateListener; 它也是一个接口,返回动画过程中evaluate计算的记过; public static interface AnimatorUpdateListener {
} |
以下用平移动画举一些例子
一、 简单的直线运动
1)既然是平移运动,就得先有一个坐标,故创建类MyPoint;
这是之后传入setObjectValues的参数,也是TypeEvaluator中evaluate用来计算的值,同时也是onAnimationUpdate获取的返回值;
public class MyPoint {
public float x;
public float y;
}
2)实现求值程序
直线运动的话,一个简单的方程就可以了;
public class MyEvaluator implements TypeEvaluator {
@Override
public Object evaluate(float fraction, Object startValue, Object endValue) {
MyPoint pointS = (MyPoint)startValue;
MyPoint pointE = (MyPoint)endValue;
float x = pointS.x + (pointE.x -