天天看點

ObjectAnimator設定動畫

ObjectAnimator是ValueAnimator的子類,他本身就已經包含了時間引擎和值計算,是以它擁有為對象的某個屬性設定動畫的功能。這使得為任何對象設定動畫更加的容易。你不再需要實作 ValueAnimator.AnimatorUpdateListener接口,因為ObjectAnimator動畫自己會自動更新相應的屬性值。

ObjectAnimator的執行個體和ValueAnimator是類似的,但是你需要描叙該對象,需要設定動畫的屬性的名字(一個字元串),以及動畫屬性值的變化範圍:

ObjectAnimator anim = ObjectAnimator.ofFloat(foo, “alpha”, 0f, 1f);

anim.setDuration(1000);

anim.start();

為了使ObjectAnimator正确的更新屬性值,你需要:

1、你要設定動畫的對象的屬性必須有一個set該值的方法。因為ObjectAnimator在動畫的過程中自動更新屬性值,這是通過調用該屬性的set方法來實作的。例如,如果屬性的名字是foo,你需要有一個setFoo()的方法,如果不存在set方法,你可以有下面三個選擇:

1)、如果你有權限,你可以為該類添加一個set方法;

2)、使用一個包裹類,通過該包裹類你可以去修改和擷取屬性值的變化,然後把它向前定向到原來的值

3)、使用ValueAnimator類替換

2、如果你在一個ObjectAnimator中隻為屬性值設定一個值,這個值被任務是動畫的結束值。 這樣的話,該對象必須有一個get方法來擷取該屬性值作為動畫的起始值.get方法必須類似于get<屬性名>.例如,如果屬性的名字叫foo,你需要有一個getFoo(),方法。

3、動畫的屬性值的gettter()方法(如果需要)和setter方法必須作用跟ObjectAnimator中的起始值是一個類型,例如如果你構造ObjectAnimator的方式是如下這樣的,則該屬性值的getter和setter方法必須如targetObject.setPropName(float) 和targetObject.getPropName(float),即都是浮點型

ObjectAnimator.ofFloat(targetObject, “propName”, 1f)

4、依賴于你設定動畫的對象和屬性,你可能需要調用View的invalidate來強制螢幕重制繪制以及更新動畫值。你可以在 onAnimationUpdate()中做這個工作。例如,為一個Drawable對象的顔色屬性設定動畫,你僅僅需要在該對象重繪的時候更新螢幕。所有View屬性的set方法,例如setAlpha()和setTranslationX()自己會調用invalid方法,是以當這些屬性值有更新時,你不需要再次調用invalid方法。要擷取更多關于監聽器的資訊。你可以檢視監聽器章節。

//屬性動畫調用start()方法後是一個異步操作
//        ObjectAnimator.ofFloat(imageView, "translationX", 0F, 360F).setDuration(1000).start();//X軸平移旋轉
//        ObjectAnimator.ofFloat(imageView, "translationY", 0F, 360F).setDuration(1000).start();//Y軸平移旋轉
//        ObjectAnimator.ofFloat(imageView, "rotation", 0F, 360F).setDuration(1000).start();//360度旋轉

        //同步動畫設計
//        PropertyValuesHolder p1 = PropertyValuesHolder.ofFloat("translationX", 0, 360F);
//        PropertyValuesHolder p2 = PropertyValuesHolder.ofFloat("translationY", 0, 360F);
//        PropertyValuesHolder p3 = PropertyValuesHolder.ofFloat("rotation", 0, 360F);
//        ObjectAnimator.ofPropertyValuesHolder(imageView, p1, p2 ,p3).setDuration(1000).start();      

繼續閱讀