【参考链接】
ValueAnimator本身并不作用于任何对象,他可以对值做动画,然后我们可以监听动画过程,在动画过程中使用计算出的值来修改对象的属性
of()
addUpdateListener()
通过of()来指定估值器和起始值终止值(相当于setEvaluator()+setValues()),通过addUpdateListener()来监听动画过程。
ValueAnimator支持的值的类型有
相比于TweenAnimation,PropertyAnimator内部除了插值器Interpolator,还有估值器Evaluator。
系统提供的估值器有IntEvaluator、FloatEvaluator、ArgbEvaluator, 上面的of()就相当于在使用这些估值器。
Evaluator提供了evaluate()方法,用于根据当前数据变化的百分比,来计算改变后的数据。以IntEvaluator为例,其evaluate()方法实现为
属性动画相当于是先通过插值器计算出数据变化的百分比,然后再通过估值器计算出改变后的数据。
以ofInt()为例(需要API 11及以上)
//起始值和终止值是0~100
ValueAnimatorvalueAnimator = ValueAnimator.ofInt(0, 100);
valueAnimator.addUpdateListener(
new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animator) {
//通过getAnimatedValue()来获取计算出的值
//因为上面是ofInt,所以这里可以强转为Integer
IntegeranimatedValue = (Integer) animator.getAnimatedValue();
((TextView) view).setText("$ " + animatedValue);
}
});
valueAnimator.setDuration(3000);
valueAnimator.start();
其同等实现为
ValueAnimatorvalueAnimator = ValueAnimator.ofInt(0, 100);
valueAnimator.addUpdateListener(
new ValueAnimator.AnimatorUpdateListener() {
private IntEvaluator mEvaluator=new IntEvaluator();
@Override
public void onAnimationUpdate(ValueAnimator animator) {
//先得到插值器返回的数据变化的百分比
float animatedFraction =animator.getAnimatedFraction();
//使用估值器,通过上面的 数据变化的百分比,得到改变后的数据
Integer evaluate = mEvaluator.evaluate(animatedFraction, 0, 100);
((TextView) view).setText("$ " + evaluate);
}
});
valueAnimator.setDuration(3000);
valueAnimator.start();
以ofArgb()为例(需要API 21及以上)
//Argb传递的值也是int
ValueAnimatorvalueAnimator = ValueAnimator.ofArgb(/*RED*/0xFFFF8080, /*BLUE*/0xFF8080FF);
valueAnimator.addUpdateListener(
new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animator) {
int animatedValue = (int) animator.getAnimatedValue();
view.setBackgroundColor(animatedValue);
}
});
valueAnimator.setDuration(3000);
valueAnimator.start();
其同等实现为
ValueAnimatorvalueAnimator = ValueAnimator.ofArgb(/*RED*/0xFFFF8080, /*BLUE*/0xFF8080FF);
valueAnimator.addUpdateListener(
new ValueAnimator.AnimatorUpdateListener() {
private ArgbEvaluator mEvaluator=new ArgbEvaluator();
@Override
public void onAnimationUpdate(ValueAnimator animator) {
float animatedFraction =animator.getAnimatedFraction();
Object evaluate = mEvaluator.evaluate(animatedFraction, /*RED*/0xFFFF8080, /*BLUE*/0xFF8080FF);
view.setBackgroundColor((int)evaluate);
}
});
valueAnimator.setDuration(3000);
valueAnimator.start();
既然上面还有ofObject(),所以我们还可以创建自己的估值器
先定义如下一个实体类
public class Point {
private float x;
private float y;
public Point(float x, float y) {
this.x = x;
this.y = y;
}
public float getX() {
return x;
}
public void setX(float x) {
this.x = x;
}
public float getY() {
return y;
}
public void setY(float y) {
this.y = y;
}
@Override
public String toString() {
return "("+x+", "+y+")";
}
}
其相应的Evaluator为
public class PointEvaluator implements TypeEvaluator<Point> {
@Override
public Point evaluate(float fraction, Point startPoint, Point endPoint) {
float x = startPoint.getX() + fraction *(endPoint.getX() - startPoint.getX());
float y =startPoint.getY() + fraction * (endPoint.getY() - startPoint.getY());
Point point = new Point(x, y);
return point;
}
}
通过如下方式使用
ValueAnimatorvalueAnimator=ValueAnimator.ofObject(new PointEvaluator(), new Point(0, 0), new Point(100, 200));
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Point point = (Point) animation.getAnimatedValue();
((TextView) view).setText(point.toString());
}
});
valueAnimator.setDuration(3000);
valueAnimator.start();
setRepeatCount()
setRepeatMode()
setInterpolator()
setStartDelay()
setDuration()
还可以设置如下属性,功能都跟TweenAnimation差不多
valueAnimator.setRepeatCount(3);
valueAnimator.setRepeatMode(ValueAnimator.RESTART);
valueAnimator.setInterpolator(new LinearInterpolator());
valueAnimator.setStartDelay(1000);//仅第一次有效,重复的时候不起作用
valueAnimator.setDuration(3000);
valueAnimator.start();
xml
上面的int效果其实也可以通过xml文件来定义。不过还是需要自己监听。
在res/animator目录下建立如下资源文件
<?xml version="1.0" encoding="utf-8"?>
<animator xmlns:android="http://schemas.android.com/apk/res/android"
android:valueType="intType"
android:valueFrom="0"
android:valueTo="100"
android:repeatCount="1"
android:repeatMode="restart"
android:startOffset="1000"
android:duration="3000">
</animator>
通过如下方式来使用
ValueAnimator valueAnimator= (ValueAnimator) AnimatorInflater.loadAnimator(this, R.animator.anim_test);
valueAnimator.addUpdateListener(
new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animator) {
int animatedValue = (int) animator.getAnimatedValue();
((TextView) view).setText("$ " + animatedValue);
}
});
valueAnimator.start();
listener
除了上面可以添加AnimatorUpdateListener,还可以添加AnimatorListener
valueAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});