Android 3.0 之后,Google提出了属性动画,有了更加丰富的动画效果了!
优点:动画效果丰富(基本能实现所有动画),并且可以进行交互
一.ObjectAnimation
先上个实现透明度动画的例子:
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "translationX", 0.1f);
animator.setDuration(3000);
animator.start();
可以看到,它的对象就直接使用静态工厂类就可以返回,
view : 需要动画的view
“translationX” : 要操作的属性 (后面会列举一些常用的属性)
0.1f : 这里是一个可变数组参数
必须注意: 使用ObjectAnimation的时候,要操作的属性必须具有get,set方法,否则无效
常用的属性值:
translationX,translationY:作为增量,控制view开始于左上角
rotation , rotationX ,rotationY : 控制view围绕支点进行2D和3D的旋转
scaleX ,scaleY : 控制view围绕支点进行2D缩放
pivotX ,pivotY : 控制view的支点位置(默认为view的中心点)
x , y : 表示view的容器中的最终位置,是左上角和translationX,translationY的累积和
alpha : 表示view对象的透明度,1代表不透明,0代表完全透明
使用以上几个属性就可以实现视图动画中的所有效果了!
对于没有get和set方法的属性,我也想用怎么办呢?
解决办法:自定义一个属性类或者包装类来间接的增加get和set方法
例子:
public class WrapperView {
private View mTarget;
public WrapperView(View target){
this.mTarget = target;
}
public int getWidth(){
return mTarget.getLayoutParams().width;
}
public void setWidth(int width) {
mTarget.getLayoutParams().width = width;
mTarget.requestLayout();
}
}
使用也比较简单了
WrapperView wrapperView = new WrapperView(textView);
ObjectAnimator.ofInt(wrapperView,"width",500).setDuration(3000).start();
使用ObjectAnimation只能对一种属性进行动画效果,那么想要多个动画呢?
二:动画集合
方式一: PropetyValuesHolder
//位移动画
PropertyValuesHolder translationX = PropertyValuesHolder.ofFloat("translationX", 300f);
//缩放动画--X轴
PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 1f, 0, 1f);
//缩放动画--Y轴
PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", 1f, 0, 1f);
//集合到一起,并开启动画
ObjectAnimator.ofPropertyValuesHolder(textView, translationX, scaleX, scaleY).setDuration(3000).start();
方式二:AnimationSet
ObjectAnimator translationX = ObjectAnimator.ofFloat(textView, "translationX", 300f);
ObjectAnimator scaleX = ObjectAnimator.ofFloat(textView, "scaleX", 1f, 0, 1f);
ObjectAnimator scaleY = ObjectAnimator.ofFloat(textView, "scaleY", 1f, 0, 1f);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.setDuration(3000);
animatorSet.playSequentially(translationX,scaleX,scaleY);
animatorSet.start();
未完待续!!