动画[3]PropertyAnimator ValueAnimator

来源:互联网 发布:非农数据从哪里看 编辑:程序博客网 时间:2024/06/03 13:15

【参考链接】

 

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(
       
newValueAnimator.AnimatorUpdateListener() {
   
@Override
   
public voidonAnimationUpdate(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(
       
newValueAnimator.AnimatorUpdateListener() {

           
privateIntEvaluatormEvaluator=newIntEvaluator();

           
@Override
           
public voidonAnimationUpdate(ValueAnimator animator) {

               
//先得到插值器返回的数据变化的百分比
               
floatanimatedFraction =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(
       
newValueAnimator.AnimatorUpdateListener() {
           
@Override
           
public voidonAnimationUpdate(ValueAnimator animator) {

               
intanimatedValue = (int) animator.getAnimatedValue();
               
view.setBackgroundColor(animatedValue);

           
}
       })
;
valueAnimator.setDuration(3000);
valueAnimator.start();

 

其同等实现为

ValueAnimatorvalueAnimator = ValueAnimator.ofArgb(/*RED*/0xFFFF8080,/*BLUE*/0xFF8080FF);
valueAnimator.addUpdateListener(
       
newValueAnimator.AnimatorUpdateListener() {

           
privateArgbEvaluatormEvaluator=newArgbEvaluator();

           
@Override
           
public voidonAnimationUpdate(ValueAnimator animator) {
               
floatanimatedFraction =animator.getAnimatedFraction();
               
Object evaluate =mEvaluator.evaluate(animatedFraction,/*RED*/0xFFFF8080,/*BLUE*/0xFF8080FF);
               
view.setBackgroundColor((int)evaluate);

           
}
       })
;
valueAnimator.setDuration(3000);
valueAnimator.start();

 


 

既然上面还有ofObject(),所以我们还可以创建自己的估值器

先定义如下一个实体类

public classPoint {
   
private floatx;
    private float
y;

    public
Point(floatx, floaty) {
       
this.x= x;
       this
.y= y;
   
}

   
public floatgetX() {
       
returnx;
   
}

   
public voidsetX(floatx) {
       
this.x= x;
   
}

   
public floatgetY() {
       
returny;
   
}

   
public voidsetY(floaty) {
       
this.y= y;
   
}

   
@Override
   
publicStringtoString() {
       
return"("+x+", "+y+")";
   
}
}

 

其相应的Evaluator

public classPointEvaluatorimplementsTypeEvaluator<Point> {

   
@Override
   
publicPointevaluate(floatfraction,Point startPoint,Point endPoint) {
       
floatx = startPoint.getX() + fraction *(endPoint.getX() - startPoint.getX());
       float
y =startPoint.getY() + fraction * (endPoint.getY() - startPoint.getY());
       
Point point =newPoint(x,y);
       return
point;
   
}
}

 

通过如下方式使用

ValueAnimatorvalueAnimator=ValueAnimator.ofObject(newPointEvaluator(), newPoint(0,0), new Point(100,200));
valueAnimator.addUpdateListener(newValueAnimator.AnimatorUpdateListener() {
   
@Override
   
public voidonAnimationUpdate(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(newLinearInterpolator());
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(
               
newValueAnimator.AnimatorUpdateListener() {
                   
@Override
                   
public voidonAnimationUpdate(ValueAnimator animator) {
                       
intanimatedValue = (int) animator.getAnimatedValue();
                       
((TextView)view).setText("$ " + animatedValue);
                   
}
               })
;
       
valueAnimator.start();

 

listener

除了上面可以添加AnimatorUpdateListener,还可以添加AnimatorListener

valueAnimator.addListener(newAnimator.AnimatorListener() {
   
@Override
   
public voidonAnimationStart(Animator animation) {
    }

   
@Override
   
public voidonAnimationEnd(Animator animation) {
    }

   
@Override
   
public voidonAnimationCancel(Animator animation) {
    }

   
@Override
   
public voidonAnimationRepeat(Animator animation) {
    }
})
;