在Android應用開發(fā)中我們每天都在接觸動畫(Activity進入和退出、頁面滑動、點擊按鈕等都有動畫效果),但入門容易,真正做好很難。如果要把效果做得自然、看上去很爽需要你有一定的美感;如果要把效果做得足夠流暢,你需要深入研究動畫,弄懂其中的細節(jié)和原理。
一、在Android平臺可以通過如下幾種方式實現(xiàn)動畫效果
1 補間動畫
補間動畫即開發(fā)者只需要指定開始、結束的關鍵幀,動畫變化的“中間幀”則由系統(tǒng)根據(jù)補間動畫加速器算法計算補齊。補間動畫包括旋轉(RotateAnimation)、透明(AlphaAnimation)、位移(TranslateAnimation)和縮放(ScaleAnimation)。補間動畫的使用有如下幾個特點:
某個動畫的實現(xiàn)既可以是一種動畫效果,也可以是多種補間動畫的組合(需要用到set標簽或者AnimationSet類);
補間動畫的實現(xiàn)既可以在xml中定義,也可以通過代碼實現(xiàn);
補間動畫的變化規(guī)律可以通過插值器(補間動畫加速器)Interpolator控制,系統(tǒng)定義了常見的插值器,如果不能滿足你的要求,可以自定義插值器;
補間動畫的難點在于根據(jù)參考點對位置的關系換算,如果處理不好,可能要弄很久。
2 幀動畫
幀動畫是一幀一幀的顯示動畫效果。創(chuàng)建幀動畫除了通過在xml中用animation-list作為根節(jié)點、item定義每一幀要顯示的圖片之外,也可以用Java代碼的形式來創(chuàng)建幀動畫。幀動畫需要用到的核心類是AnimationDrawable。
幀動畫的特點是:
實現(xiàn)簡單;
效率低;
視覺工作量大。
3 屬性動畫
屬性動畫是在Android 3.0開始引入的一種動畫模式(如果想在Android 3.0之前的版本中使用屬性動畫,可以引用JakeWharton開源的NineOldAndroids),有了屬性動畫,可以考慮再也不使用補間動畫和幀動畫了,它功能強大、使用靈活,強烈建議在實際編碼中使用屬性動畫。
關于屬性動畫的介紹網(wǎng)上已經(jīng)有很多優(yōu)秀的技術文章,比如郭霖的Android屬性動畫完全解析(上),初識屬性動畫的基本用法、Android屬性動畫完全解析(中),ValueAnimator和ObjectAnimator的高級用法和Android屬性動畫完全解析(下),Interpolator和ViewPropertyAnimator的用法,所以不再贅述。
4 GIF
GIF是一種圖片格式,它分為靜態(tài)GIF和動畫GIF兩種,擴展名為.gif,是一種壓縮位圖格式,支持透明背景圖像,適用于多種操作系統(tǒng),“體型”很小,網(wǎng)上很多小動畫都是GIF格式。其實GIF是將多幅圖像保存為一個圖像文件,從而形成動畫,最常見的就是通過一幀幀的動畫串聯(lián)起來的搞笑gif圖,所以歸根到底GIF仍然是圖片文件格式。但GIF只能顯示256色。
GIF有天然的劣勢,圖片質(zhì)量很低,有很多應用的Splash界面會直接播放gif格式的文件,避免通過xml和代碼實現(xiàn)起來過于復雜,github上優(yōu)秀的GIF開源庫有:GifView和android-gif-drawable。
5 視頻
有很多應用的引導界面是直接播放的視頻,特別是一些大型的游戲,反編譯它的代碼可以看到,就是一個視頻文件。視頻文件在分辨率適配上會比較麻煩,制作成本也比較大。
6 SVG
SVG是可縮放矢量圖形,他是基于可擴展標記語言,用于描述二維矢量圖形的一種圖形格式。它嚴格遵從XML語法,并用文本格式的描述性語言來描述圖像內(nèi)容,因此是一種和圖像分辨率無關的矢量圖形格式。SVG格式具備目前網(wǎng)絡流行的jpg和png等格式無法具備的優(yōu)勢:可以任意放大圖形顯示,但絕不會以犧牲圖像質(zhì)量為代價;可在SVG圖像中保留可編輯和可搜尋的狀態(tài);平均來講,SVG文件比其它格式的圖像文件要小很多,因而下載也很快。關于SVG更為詳細的介紹可以參考這篇文章:Android實現(xiàn)炫酷SVG動畫效果。
7 其它
還可以通過自定義類,用定時器給ImageView更換背景圖片的方式實現(xiàn)動畫;如果使用到了游戲引擎,游戲引擎中對動畫的渲染效率有增強,動畫效果會很流暢。
二、使用動畫過程中遇到過哪些坑
在有動畫效果的界面,強烈建議不要關掉硬件加速,在沒有硬件加速的環(huán)境下運行動畫效果會顯得不流暢;
動畫(特別是循環(huán)播放的動畫)效果功耗很大(因為CPU和GPU在高負荷持續(xù)工作呀),為了降低功耗,盡量控制動畫的大小,以及動畫出現(xiàn)的時機,最好是用戶觸發(fā)某個操作后執(zhí)行動畫效果,不要一進入界面就執(zhí)行動畫;
謹慎使用AnimationDrawable,在4.2及之前的版本會很耗內(nèi)存;并且AnimationDrawable中的每一幀圖片在使用完后不能釋放,否則在下次使用時會直接報異常;還有每一幀圖片不宜過大,否則會卡成翔;