Android中的動畫實踐之屬性動畫(一 )

? ? ? 接著上篇Android中的動畫(XML方式)實踐(逐幀動畫與補間動畫)來學習下屬性動畫。

? ? 我們知道屬性動畫是API11(android3.0)新加入的特性。其實部分常用的動畫效果靠傳統動畫也可解決,那么:

為什么要引入屬性動畫

? ? ? 我們先看看傳統動畫能實現什么:幀動畫功能單一不必多說(圖片順序播放),再看補間動畫---可對View進行一系列的效果變換淡入淡出、縮放、平移、旋轉)??瓷暇浼哟植糠直隳苊靼?,補間動畫有兩個局限性:1.作用對象單一(View)2.效果變換固定。舉幾個例子:1.我要給TextView加個動畫,從當前寬度增加到300像素。這個用補間動畫是實現不了的,有人說可以通過x方向縮放實現,但你要那么做了,就會把里面的文字也在x方向拉伸,而不僅僅改變textview寬度(改變了整個textview)。2.我要對一個imageview(想象一下:顯示一個大美女的那種)做個3D旋轉,這個用補間動畫也是做不了的。還有一點可以說是補間動畫最坑的地方:它只改變View的顯示,而沒改變View的屬性。這就會造成類似下圖那種好玩(cao dan)的現象:

補間動畫--顯示改變 屬性未變

那屬性動畫就能實現這些補間動畫不能實現的效果嗎?是的!連帶也把補間動畫能實現的效果也給實現了。是不是很強勢。。。

開始使用屬性動畫

在開始使用之前,我們首先要知道它能用在哪?否則會鬧出類似拿剁骨刀削蘋果的笑話。

之所以稱之為屬性動畫,是因為它可以對任意對象的屬性進行動畫變換。也就是說:只要對象有這個屬性,你都能用屬性動畫來實現動畫(java中有萬物皆對象一說,可見屬性動畫的適用范圍之廣)。大致含義搞清楚了,下面就開始寫幾個例子,學習一下(以屬性動畫中常用的三個類:ObjectAnimator(繼承自ValueAnimator),ValueAnimator,AnimatorSet(動畫集合)為例):

1.以view自身中心為旋轉點順時針旋轉半圈(ObjectAnimator實現):

object-代碼段

看看效果圖:

object-效果圖

2.對view背景色(透明-橘色-亮綠)做改變(ValueAnimator實現):

value-代碼段

效果圖:

value-效果圖

3.對view同時做漸變,縮放,旋轉操作(AnimatorSet實現):

set-代碼段

運行效果:

set-效果圖

上面分別使用ObjectAnimator,ValueAnimator和AnimatorSet實現了一些效果。那下面一個個依次的詳細說一下:

ObjectAnimator

第一個例子就足以證明一點:用ObjectAnimator實現動畫真特么太簡單了,一行代碼就可以實現旋轉效果(當然不只于旋轉)。好吧,我們進去ObjectAnimation類看看:

繼承自ValueAnimator

看看我們上面例子中用到了ofFloat方法,不禁要問:里面的設置的參數都是些什么鬼?現在就來找到那個方法,看看具體是怎么回事:

ofFloat方法

我們可以看到方法里面創建并了返回了一個ObjectAnimator對象。具體看一下各參數的含義吧:第一個參數target :表示要執行動畫的對象;第二個參數propertyName:對象被改變屬性對應的屬性名(這個后面還要詳細說);第三個可變參數values:可以理解為動畫過程設置的屬性值。

參數values展開來說

當我們調用方法指定values為一個值,表示動畫結束時屬性值(如上例);兩個值則表示開始值和結束值;三個或三個以上,其中第一個和最后一個值分別表示開始和結束屬性值,中間則表示動畫過程中任意屬性值。說得再多還不如試試更容易理解:values設為一個值的我們已經試過,現在來試試設置多個值的:

values兩個值:ofFloat(mImageView,"rotation",90f,285f)
values多(三)個值:? ? ? ? ? ofFloat(mImageView,"rotation",90f,300f,60f)

其實ObjectAnimator類似ofFloat的方法還有ofInt,ofArgb,乃至ofObject等,這些方法都是設置動畫作用的對象、改變的屬性和動畫開始,結束還有中間(任意個數)的屬性值。

參數propertyName屬性名詳解

還拿ofFloat方法來說,第一個參數target 含義好理解,第三個參數values也說過了,那第二個參數propertyName到底怎么理解,是隨便寫一個字符串就行了嗎?顯然不是!上面ofFloat函數的注釋已經做了解釋:第一個參數target對象應該有個類似方法名為setName作用域為public的方法,第二個參數propertyName即可指定對應屬性名為name。

就拿我們上面旋轉來說:... .ofFloat(mImageView,"rotation",...)? ? 我們指定屬性名為“rotation”,那肯定ImageView或其父類存在 setRotation 方法--果不其然在ImageView 父類View中找到了該方法:

setRotation

然后還會發現一個好玩的現象--我們試著換種寫法:

ofInt-rotation-error

把ofFloat換成ofInt,后面參數改為int型,發現會報錯。大概可以理解為沒在ImageView(或其父類)中找到setter方法public void setRotation(int arg);我們從源碼中看到setRotation方法參數是float類型的,所以用ofFloat方法,它不會報錯,因為能找到相應類型參數的setter方法。也就是說:方法ofXxx中的類型Xxx應該與指定屬性對應setter方法的參數值一致。這樣一說,我們我就會理解為什么可變參數values是指定屬性值的。

當然也并不是只要作用對象target有setXxx方法,我們對target屬性xxx做動畫,就能生效:這里需要滿足兩個條件:

1.如果動畫沒有傳遞初始值,那么target中需要提供getXxx方法,因為系統要自己去取屬性的初始值,若不滿足這點,程序會崩潰。比如:

針對屬性-imageResourse動畫

由于ImageView中沒有getImageResource方法但存在setImageResource,如上圖代碼段,沒指定初始值,這樣的話,運行就會直接crash掉。

2.target對象的setXxx對屬性xxx所做的改變得通過一些途徑反映出來。就比如帶來UI上的改變。這很好理解,要不能在UI上給用戶反映出來,那用戶就沒法看到動畫效果。看看這句:

針對屬性-maxwidth動畫

imageview有setMaxWidth和getMaxWidth方法,但maxwidth屬性對imageview在外在表現上沒有影響的,所以我們看不到有任何效果。

對第一點還需要多說一下,不能錯誤理解為target沒有getXxx方法,運行代碼就會崩潰,是有兩個條件(target沒有提供getXxx方法+沒有設置初始值)看看下面的代碼就可以明白了(同樣針對imageResourse):

imageResourse-動畫-有初始值

運行一下,是不會報錯的:

運行結果

PropertyValuesHolder

我們能不能僅僅使用一個動畫(ObjectAnimator)就實現多個效果呢?比如說旋轉,縮放,漸變,位移幾個效果一起?(盡管這種“多效果”用AnimatorSet可輕松實現)。

問題先留在這里,待會再解答。

上面有提到過ObjectAnimator類似ofFloat的方法還有ofInt,ofArgb,ofObject等,還有一個方法叫做ofPropertyValuesHolder:

ofPropertyValuesHolder方法

函數返回值與ofFloat等一致為ObjectAnimator對象,參數target為動畫作用對象,那后面的values參數:PropertyValuesHolder類型的可變數組是什么意思。這個PropertyValuesHolder是什么東西,看看該類:

PropertyValuesHolder 類

還是看注釋:注釋第一句 看類名(Property-Values-Holder)其實就可以理解;第二句剛好可以回答上面提出帶答的問題。所以答案顯而易見--能。那就實現一個看看吧:

ofPropertyValuesHolder 實現多效果 代碼段
運行結果

另:PropertyValuesHolder常用創建實例的函數有下面四種:

public static PropertyValuesHolder ofFloat(String propertyName, float... values)

public static PropertyValuesHolder ofInt(String propertyName, int... values)

public static PropertyValuesHolder ofObject(String propertyName, TypeEvaluator evaluator,Object... values)

public static PropertyValuesHolder ofKeyframe(String propertyName, Keyframe... values)

現在這里就不展開來說了。


未完下次再續。。。

由于作者水平有限,有紕漏或錯誤處還望大家批評指正,謝謝!

感謝:

任玉剛 《Android開發藝術探索》

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容