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

未完待續!!

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