一、属性动画要求动画作用的对象提供该属性的get和set方法,属性动画根据你传递的该熟悉的初始值和最终值,以动画的效果多次去调用set方法,每次传递给set方法的值都不一样,确切来说是随着时间的推移,所传递的值越来越接近最终值。总结一下,你对object的属性xxx做动画,如果想让动画生效,要同时满足两个条件:
object必须要提供setXxx方法,如果动画的时候没有传递初始值,那么还要提供getXxx方法,因为系统要去拿xxx属性的初始值(如果这条不满足,程序直接Crash)
object的setXxx对属性xxx所做的改变必须能够通过某种方法反映出来,比如会带来ui的改变啥的(如果这条不满足,动画无效果但不会Crash)
- 通过ObjectAnimator的静态工厂方法,创建一个ObjectAnimator对象。第一个参数是需要操控的View,第二个参数是要操作的属性。而最后一个参数是一个可变数组参数,需要传进去该属性变化的一个取值过程。
1、属性动画:拉伸
拉伸属性:
width
height
/**
* 属性动画:拉伸
*/
public void strchView(){
ObjectAnimator.ofInt(button, "width", 700).setDuration(3000).start();
}
2、属性动画:旋转
旋转属性:
rotation
rotationX
rotationY
/**
* 属性动画:旋转
*/
public void rotateView(){
ObjectAnimator.ofFloat(button, "rotationY", 0.0f, 360).setDuration(300).start();
}
3、位移:
translationX
translationY
ObjectAnimator.ofFloat(imageView, "translationX", 0.0f, 300.0f).setDuration(3000).start();
4、缩放:
scaleX
scaleY
ObjectAnimator.ofFloat(imageView, "scaleX",0.0f, 2.0f).setDuration(3000).start();
ObjectAnimator.ofFloat(imageView, "scaleY",0.0f, 2.0f).setDuration(3000).start();
当一个属性没有get、set方法时,有两种方案可以选择:
一、通过自定义一个属性类或者包装类。来间接的给这个属性增加set、get方法。
public static class WrapperView {
private View mTarget;
public WrapperView(View mTarget) {
this.mTarget = mTarget;
}
public int getWidth(){
return mTarget.getLayoutParams().width;
}
public void setWidth(int width){
mTarget.getLayoutParams().width = width;
mTarget.requestLayout();
}
}
使用时操作包装类就可以调用set、get方法。
二、通过ValueAnimator来实现。
ObjectAnimator继承自ValueAnimator.
ValueAnimator本身不提供任何动画效果,它更像一个数值发生器,用来产生具有一定规律的数字,从而来控制动画的实现过程。
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0.0f, 100.0f);
valueAnimator.setTarget(imageView);
valueAnimator.setDuration(3000).start();
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Float value = (Float) animation.getAnimatedValue();
}
});
二、PropertyValuesHolder
类似于AnimatorSet,在属性动画中,如果针对同一个属性的同一个对象的多个属性,要同时作用于多种动画,可以使用PropertyValuesHolder来实现。
PropertyValuesHolder x = PropertyValuesHolder.ofFloat("scaleX", 0.0f, 2.5f);
PropertyValuesHolder y = PropertyValuesHolder.ofFloat("scaleY", 0.0f, 3.0f);
ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(imageView, x, y);
animator.setDuration(3000);
animator.start();
三、动画事件的监听