Android3.0以后增加了属性动画,相比之前的Tween(渐变、缩放、位移、旋转)要容易一些,动画作为View的属性,使用更简单、灵活。

1、ObjectAnimator实现动画

2、 ValueAnimator实现动画

3、 AnimatorSet的使用

4、PropertyValueHolder实现组合动画

5、 View的动画方法

ObjectAnimator实现动画

ObjectAnimator实现动画很简单, 首先得到 ObjectAnimator对象,获取该对象有三个方法

ObjectAnimator.ofFloat(target, propertyName, values), ObjectAnimator.ofInt(target, propertyName, values), ObjectAnimator.ofPropertyValuesHolder(target, values)

说一下参数是什么意思, target:要添加动画的目标View 。

propertyName:属性的类型。 scaleX /  scaleY :缩放比 。 alpha:透明度。rotation:旋转角度。x / y:X或Y轴位移。translationY: 位移

这个值也可以是自定义,然后监听 AnimatorUpdateListener自己去组合改变View的动画属性 。

 ObjectAnimator anim = ObjectAnimator.ofFloat(view, "yuan", 1.0F,5.0F).setDuration(5000);
   anim.start();
   anim.addUpdateListener(new AnimatorUpdateListener() {
   @Override
   public void onAnimationUpdate(ValueAnimator animation) {
   float cVal = (Float) animation.getAnimatedValue();}
   }
   });

ObjectAnimator也能在xml文件中去定义组合。

ValueAnimator实现动画

ValueAnimator 基本的用法和  ObjectAnimator 自定义 propertyName差不多,监听 AnimatorUpdateListener,

在 onAnimationUpdate去改变View的值,但是 ValueAnimator  有一个重要的扩展功能,就是能定义传入数据的类型,不仅仅局限int,float两种数据类型了。

基本用法:

 ValueAnimator animator = ValueAnimator.ofFloat(0,10);  //设置变化值的范围
        animator.setTarget(imageView);  
        animator.setDuration(10000).start();  
        animator.addUpdateListener(new AnimatorUpdateListener()  
        {  
            @Override  
            public void onAnimationUpdate(ValueAnimator animation)  
            {  
              imageView.setTranslationY((Float) animation.getAnimatedValue());  
            }  
        });  

自定义 TypeValue的用法  :

 ValueAnimator animator = new ValueAnimator();animator.setDuration(5000);
animator.setObjectValues(0);//设置值的类型,该方法与 setEvaluator一起使用
//计算每帧动画的值大小
 animator.setEvaluator(new TypeEvaluator<Integer>() {
@Override
public Integer evaluate(float fraction, Integer startValue,
Integer endValue) {
// TODO Auto-generated method stub
return startValue+10;
} 
})

AnimatorSet的使用

AnimatorSet ,动画集合,组合多个动画,有两种组合的方法

1、在xml文件<set>标签去组合动画, android:ordering属性值得注意, android:ordering=“ sequentially”按顺序执行, android:ordering=“    together   ”同时执行

2、代码中去组合动画

定义多个 ObjectAnimator 动画,

   AnimatorSet animSet = new AnimatorSet();  
        animSet.setDuration(5000);  
        animSet.setInterpolator(new LinearInterpolator());  
       animSet.playTogether(anim1,anim2,anim3,anim4,animator);  //一起执行
        animSet.playSequentially(anim1,anim2,anim3,anim4,animator)//按顺序执行
        animSet.start(); 

当然,这种方式如果还是不能满足我们的要求,用一下的方式我们可以自由随意组合

// 定义多个 ObjectAnimator 动画
ObjectAnimator anim1 = ObjectAnimator.ofFloat(mBlueBall, "scaleX",  
                1.0f, 2f); 
  AnimatorSet animSet = new AnimatorSet();  
        animSet.play(anim1).with(anim2);animSet.play(anim2).with(anim3);   animSet.play(anim4).after(anim3); 
        animSet.setDuration(1000);    animSet.start();  

这里解释下几个方法:

play(),这个很好理解,就是播放动画,调用这个方法的同时会返回  AnimatorSet.Builder 对象,

with()   AnimatorSet.Builder的方法,与play()的动画一起执行。

after(Animator anim)在anim动画执行完成之后执行。

PropertyValueHolder实现组合动画

前面讲过 ObjectAnimator.ofPropertyValuesHolder(target, values)也能获得  ObjectAnimator对象,这里的参数value就是

PropertyValuesHolder 对象了。

//多个动画组合
PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("alpha", 1f,   0f, 1f);  
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("scaleX", 1f,   0, 1f);  
PropertyValuesHolder pvhZ = PropertyValuesHolder.ofFloat("scaleY", 1f,  0, 1f);  
 ObjectAnimator.ofPropertyValuesHolder(imageView, pvhX,pvhY,pvhZ).setDuration(3000).start();

View的动画方法

在SDK11的时候,给View添加了animate方法,更加方便的实现动画效果

View.animate().y(mScreenHeight / 2).setDuration(1000).withStartAction(runable).withEndAction( 
 runable 
 );

实现动画确实非常方便了,但是  withStartAction和 withEndAction两个方法必要要API 15以上才有这两个方法。