又和大家見面了者疤,筆者想問一下福澡,大家有沒有用上次的那個表白神器啊,那么丑的界面可能有不少人被吐槽了吧哈哈驹马。革砸。。糯累。這個不是今天的重點算利。還記得我們的動畫效果是怎么實現(xiàn)的嗎:
我們用ValueAnimator設(shè)置監(jiān)聽器,然后改變當前桃心的大小泳姐,最后重繪動畫效拭。
其實我們發(fā)現(xiàn),我們之前做的案例胖秒,幾乎都是用ValueAnimator實現(xiàn)的(可能因為覺得監(jiān)聽器接口回調(diào)比較炫酷吧-缎患。+),但是ObjectAnimator卻沒怎么用過阎肝,除了最開始介紹屬性動畫是從ObjectAnimator介紹的挤渔,但是只是在屬性動畫內(nèi)置的幾種屬性中,使用了ObjectAnimator风题。今天在這基礎(chǔ)上判导,我們來深入了解一下ObjectAnimator,然后用ObjectAnimator來實現(xiàn)之前東西沛硅。
ObjectAnimator和ValueAnimator原理
關(guān)于ObjectAnimator眼刃,我們目前只知道,他是繼承了ValueAnimator類摇肌,所以ValueAnimator能用的方法鸟整,ObjectAnimator幾乎都能用,但是他們的工作原理是有一點不同的朦蕴,如下圖所示:
我簡單的畫了一張兩種屬性動畫類的工作原理圖篮条,大體上是差不多的,但是ValueAnimator是通過UpdateListener回調(diào)吩抓,而ObjectAnimator是根據(jù)我們給的屬性拼接成set方法涉茧,然后通過反射調(diào)用。(我們現(xiàn)在就先這里理解疹娶,更深層次的實現(xiàn)流程我會專門寫一篇源碼分析篇伴栓。)
我們之前的理解很可能是ObjectAnimator中propertyName屬性是我們填入的target對象的一個屬性,我們更改他的值雨饺。而現(xiàn)在我們知道了钳垮,我們是調(diào)用的對應(yīng)set方法。我們舉個簡單的例子:
我們propertyName中填入的是translationX额港,那我們?nèi)extView中看看到底有沒有這個屬性饺窿,其實是沒有的,大家下去自己查移斩,再去View中看看有沒有肚医,也沒有,但是父類View中有一個方法叫做setTranslationX
結(jié)論:他是通過拼接對應(yīng)set方法向瓷,再通過反射調(diào)用的肠套。而不是里面這個屬性。
也就是說猖任,我們propertyName中填寫的是控件對應(yīng)set方法的方法名:加入有一個setAsd方法你稚,那么我們在propertyName中寫asd或者Asd就可以了。
以下是我對ObjectAnimator使用的總結(jié):
我們結(jié)合實例來驗證一下這些朱躺,就用我們上次做的小球來驗證吧刁赖。
效果如下:
這是我們之前用ValueAnimator實現(xiàn)的,現(xiàn)在我們用ObjectAnimator實現(xiàn)
我們在PropertyValueHolder中添加了propertyName屬性室琢,為position乾闰,所以我們還需要一個setPosition方法:
效果如下:
跟ValueAnimator是一樣的效果。接下來我們驗證上面幾點:
1.把setPosition方法名改錯盈滴。
我們發(fā)現(xiàn)小球不動作涯肩,然后看一下日志:
他打印一條verbose級別的log。上面寫的很清楚巢钓,不用多說了病苗。
2.添加get方法,當只有一個values時症汹,調(diào)用get方法硫朦。
這是我們的getPosition方法,我們返回一個新的球背镇,坐標為900咬展,900泽裳。
由于KeyFrame不能只有一個,所以我們這次通過ofObject創(chuàng)建動畫破婆,但是只寫了一個參數(shù)涮总,坐標為300,300的球祷舀。然后效果:
看來的確從get方法中獲取到的值作為了起始點瀑梗,結(jié)論正確。
3.set方法修改為private和protected類型裳扯。
我們修改為protected類型抛丽,效果如下:
還是可以動作的,然后改為private類型:
結(jié)論正確饰豺。
其余的應(yīng)該沒什么問題了亿鲜,大家可以下去自己測試一下。
以上便是我們關(guān)于ObjectAnimator屬性動畫的詳細解釋哟忍。希望大家多多關(guān)注一波狡门。