ViewPropertyAnimator的使用

ViewPropertyAnimator、ObjectAnimator、ValueAnimator 這三種 Animator,

它們其實是一種遞進的關係:從左到右依次變得更加難用,也更加靈活。

 

它們的性能是一樣的,因爲 ViewPropertyAnimator 和 ObjectAnimator 的內部實現其實都是 ValueAnimator,ObjectAnimator 更是本來就是 ValueAnimator 的子類,它們三個的性能並沒有差別。

 

它們的差別只是使用的便捷性以及功能的靈活性。

所以在實際使用時候的選擇,只要遵循一個原則就行:儘量用簡單的。

能用 View.animate() 實現就不用 ObjectAnimator,

能用 ObjectAnimator 就不用 ValueAnimator。

 

老版本屬性動畫

 

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.playTogether(objectAnimator,objectAnimator1);

animatorSet.start();

 

簡化版屬性動畫:

btnShow.animate()

        .setDuration(2000)

        .translationX(300)

        .rotation(360)

        .start();

 

ViewPropertyAnimator

View類的animate()方法,是在Android 3.1系統上新增的一個方法,其作用就是返回ViewPropertyAnimator的實例對象。

 

 /**

 * This method returns a ViewPropertyAnimator object, which can be used to animate

 * specific properties on this View.

 *

 * @return ViewPropertyAnimator The ViewPropertyAnimator associated with this View.

 */

public ViewPropertyAnimator animate() {

    if (mAnimator == null) {

        mAnimator = new ViewPropertyAnimator(this);

    }

    return mAnimator;

}

 

特點:

1、專門針對View對象動畫而操作的類。

2、提供了更簡潔的鏈式調用設置多個屬性動畫,這些動畫可以同時進行的。

3、擁有更好的性能,多個屬性動畫是一次同時變化,只執行一次UI刷新(也就是隻調用一次invalidate,而n個ObjectAnimator就會進行n次屬性變化,就有n次invalidate)。

4、每個屬性提供兩種類型方法設置。

5、該類只能通過View的animate()獲取其實例對象的引用

 

參考:屬性動畫-Property Animation之ViewPropertyAnimator 你應該知道的一切

Android動畫-屬性動畫-ViewPropertyAnimator

常見設置

如下:

 

 

                view.animate()//獲取ViewPropertyAnimator對象

                        //動畫持續時間

                        .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())//回彈

                        .setInterpolator(new AccelerateDecelerateInterpolator())//加速再減速

                        .setInterpolator(new AccelerateInterpolator())//加速

                        .setInterpolator(new DecelerateInterpolator())//減速

                        .setInterpolator(new LinearInterpolator())//線性

 

                        //動畫延遲

                        .setStartDelay(1000)

 

                        //是否開啓硬件加速

                        .withLayer()

 

                        //監聽

                        .setListener(new Animator.AnimatorListener() {

                            @Override

                            public void onAnimationStart(Animator animation) {

                                Log.i("MainActivity", "run: onAnimationStart");

                            }

 

                            @Override

                            public void onAnimationEnd(Animator animation) {

                                Log.i("MainActivity", "run: onAnimationEnd");

                            }

 

                            @Override

                            public void onAnimationCancel(Animator animation) {

                                Log.i("MainActivity", "run: onAnimationCancel");

                            }

 

                            @Override

                            public void onAnimationRepeat(Animator animation) {

                                Log.i("MainActivity", "run: onAnimationRepeat");

                            }

                        })

 

                        .setUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

                            @Override

                            public void onAnimationUpdate(ValueAnimator animation) {

                                Log.i("MainActivity", "run: onAnimationUpdate==");

                            }

                        })

 

                        .withEndAction(new Runnable() {

                            @Override

                            public void run() {

                                Log.i("MainActivity", "run: end");

                            }

                        })

                        .withStartAction(new Runnable() {

                            @Override

                            public void run() {

                                Log.i("MainActivity", "run: start");

                            }

                        })                        .start();

 

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