Android 动画机制 之 属性动画

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();

未完待续!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章