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