2015-02-07 78 views
2

如果ObjectAnimator如果將屬性x指定爲字符串,它將如何調用相應的方法setX。我的意思是,用什麼技術來識別我想動畫我視圖的屬性「旋轉」並調用該視圖的適當方法setRotation?Android ObjectAnimator如何工作?

我已經理解了ObjectAnimator如何工作並設法使用它,這很簡單,我只是對操作原理感到好奇。

對不起,我的英語,我從來沒有使用它:)

+0

對於屬性「foo」,setFoo方法通過reflaction調用 – pskink 2015-02-07 10:32:33

回答

6

有多種方式以動畫視圖的旋轉:

ObjectAnimator.ofFloat(view, "rotation", 0f, 90f).start();

這使用reflection到請致電setRotation(float f)float getRotation()視圖的方法。

只要該類爲該屬性實現了適當的getter和setter方法,就可以使用此方法爲類的任何屬性設置動畫。

但反射是一個緩慢的操作,所以有第二種方法不使用反射。

2.ObjectAnimator.ofFloat(view, View.ROTATION, 0f, 90f).start();

這使用旋轉屬性的視圖。 Property是一個抽象類,它定義了setValue(T)T get()方法,該方法又調用提供對象的實際獲取器和設置器。例如,在View類旋轉屬性使用下面的代碼:

public static final Property<View, Float> ROTATION = new FloatProperty<View>("rotation") { 
    @Override 
    public void setValue(View object, float value) { 
     object.setRotation(value); 
    } 

    @Override 
    public Float get(View object) { 
     return object.getRotation(); 
    } 
}; 

如果要動畫對象的自定義屬性,你可以實現自己的財產像上面的。

然後有第三種方法,它也不使用反射。

view.animate().rotation(90f);

這其中有一個流暢的接口,所以它更容易使用。例如:您可以將多個動畫鏈接在一起運行,例如:view.animate().rotation(90f).translationX(10f);

此方法的缺點是隻能對視圖的標準屬性進行動畫製作,而不能在您自己的類上設置自定義屬性或屬性。

+1

呃,使用反射來生成動畫Object聲音太糟糕了,應該不可能! – Blablablabli 2017-02-22 09:24:14

相關問題