动画[3]PropertyAnimator ValueAnimator

【参考链接】

 

ValueAnimator本身并不作用于任何对象,他可以对值做动画,然后我们可以监听动画过程,在动画过程中使用计算出的值来修改对象的属性

 

of()

addUpdateListener()

通过of()来指定估值器和起始值终止值(相当于setEvaluator()+setValues()),通过addUpdateListener()来监听动画过程。

ValueAnimator支持的值的类型有

相比于TweenAnimationPropertyAnimator内部除了插值器Interpolator,还有估值器Evaluator

系统提供的估值器有IntEvaluatorFloatEvaluatorArgbEvaluator, 上面的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) {
    }
})
;

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值