Android動畫-屬性動畫-ViewPropertyAnimator

原文地址 http://blog.csdn.net/qq_25806863/article/details/70229687

想想之前使用組合動畫的時候,是不是這樣的:

ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(btnShow, "translationX", 0, 300);
ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(btnShow, "rotation", 0, 360);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.setDuration(2000);
animatorSet.play(objectAnimator).with(objectAnimator1);
animatorSet.start();

或者這樣的:

 ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(btnShow, "translationX", 0, 300);
ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(btnShow, "rotation", 0, 360);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.setDuration(2000);
animatorSet.playTogether(objectAnimator,objectAnimator1);
animatorSet.start();

達到的效果是:
這裏寫圖片描述

初見

然而,還能用下面的方法實現這個效果:

btnShow.animate()
        .setDuration(2000)
        .translationX(300)
        .rotation(360)
        .start();

簡單了很多有沒有 !

概述

平常所做的動畫大部分是針對View的,而View經常會需要集中動畫混合在一起做,因此提供了一個ViewPropertyAnimator類來快速的實現多個動畫的混合。

ViewPropertyAnimator對同時進行多個動畫進行了性能優化,雖然有多個動畫同時進行,但是一次只刷新一次ui,不會讓每個動畫都去刷新ui。而且很明顯他的寫法非常簡單。

獲取ViewPropertyAnimator

只能通過View.animate()獲取ViewPropertyAnimator。

常用方法

這裏把能鏈式調用的全列舉出來,感受一下他的方便之處:

                btnShow.animate()
                        .setDuration(5000)
                        //透明度
                        .alpha(0)
                        .alphaBy(0)
                        //旋轉
                        .rotation(360)
                        .rotationBy(360)
                        .rotationX(360)
                        .rotationXBy(360)
                        .rotationY(360)
                        .rotationYBy(360)
                        //縮放
                        .scaleX(1)
                        .scaleXBy(1)
                        .scaleY(1)
                        .scaleYBy(1)
                        //平移
                        .translationX(100)
                        .translationXBy(100)
                        .translationY(100)
                        .translationYBy(100)
                        .translationZ(100)
                        .translationZBy(100)
                        //更改在屏幕上的座標
                        .x(10)
                        .xBy(10)
                        .y(10)
                        .yBy(10)
                        .z(10)
                        .zBy(10)
                        //監聽及其他設置
                        .setInterpolator(new BounceInterpolator())
                        .setStartDelay(1000)
                        .setListener(new Animator.AnimatorListener() {
                            @Override
                            public void onAnimationStart(Animator animation) {
                            }
                            @Override
                            public void onAnimationEnd(Animator animation) {
                            }
                            @Override
                            public void onAnimationCancel(Animator animation) {
                            }
                            @Override
                            public void onAnimationRepeat(Animator animation) {
                            }
                        })
                        .setUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                            @Override
                            public void onAnimationUpdate(ValueAnimator animation) {
                            }
                        })
                        .withEndAction(new Runnable() {
                            @Override
                            public void run() {
                                Log.i(TAG, "run: end");
                            }
                        })
                        .withStartAction(new Runnable() {
                            @Override
                            public void run() {
                                Log.i(TAG, "run: start");
                            }
                        })
                        .start();
  1. 動畫的方法名和ObjectAnimator中藥填寫的屬性名是一樣的,很容易明白。
  2. 每個動畫都有一個By的後綴的方法。加上By的意思是,繼續動畫這麼多數值。不加By的意思是動畫到這個數值。
  3. 也可以設置插值器和Animator.AnimatorListener監聽以及ValueAnimator.AnimatorUpdateListener監聽
  4. 可以直接設置動畫開始和結束時的回調方法。
  5. 但是好像沒有重複動畫的功能

關於By

下面用旋轉來演示一下By的區別。

按鈕初始旋轉角度已經旋轉了90, 當點擊按鈕執行的動畫是下面這樣的時候,表示旋轉到180:

btnShow.animate()
        .setDuration(2000)
        .rotation(180)
        .start();

這裏寫圖片描述

第一次點擊會從90旋轉到180,再次點擊會從180旋轉到180,因爲已經是180了,所以看着沒動。

如果是By呢?:

btnShow.animate()
                        .setDuration(2000)
                        .rotationBy(180)
                        .start();

這裏寫圖片描述

發佈了74 篇原創文章 · 獲贊 199 · 訪問量 51萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章