【参考链接】
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) {
}
});
本文详细介绍了Android属性动画的工作原理,包括ValueAnimator的使用方法、如何创建自定义Evaluator以及如何通过XML定义动画等内容。
1321

被折叠的 条评论
为什么被折叠?



