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以上才有这两个方法。