Android動畫技術點總結(二)——逐幀動畫
2.逐幀動畫
逐幀動畫就像是GIF,快速更換圖片,主要有AnimationDrawable完成,用起來比較簡單,所以擴充套件性不強,講一下AnimationDrawable就好了。
例子,素材圖是我把一個GIF的每一幀圖片拆出來的

frame.gif
原GIF(如有侵權,敬請告知,立刻刪除)

原GIF.gif(如有侵權,敬請告知,立刻刪除)
2.1 使用
素材

素材.png
程式碼
在drawable目錄下建立 animation-list 標籤的檔案
<!--frame_anim.xml--> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@drawable/frame_00" android:duration="90" /> <item android:drawable="@drawable/frame_01" android:duration="90" /> <item android:drawable="@drawable/frame_02" android:duration="90" /> <item android:drawable="@drawable/frame_03" android:duration="90" /> <item android:drawable="@drawable/frame_04" android:duration="90" /> <item android:drawable="@drawable/frame_05" android:duration="90" /> <item android:drawable="@drawable/frame_06" android:duration="90" /> <item android:drawable="@drawable/frame_07" android:duration="90" /> <item android:drawable="@drawable/frame_08" android:duration="90" /> <item android:drawable="@drawable/frame_09" android:duration="90" /> <item android:drawable="@drawable/frame_10" android:duration="90" /> <item android:drawable="@drawable/frame_11" android:duration="90" /> <item android:drawable="@drawable/frame_12" android:duration="90" /> <item android:drawable="@drawable/frame_13" android:duration="90" /> </animation-list>
在Java程式碼中使用即可
ImageView image = findViewById(R.id.image); image.setImageResource(R.drawable.frame_anim); AnimationDrawable drawable = (AnimationDrawable) image.getDrawable(); drawable.start();
純Java也可以實現
ImageView image = findViewById(R.id.image); int[] resIds = new int[]{ R.drawable.frame_00, R.drawable.frame_01, R.drawable.frame_02, R.drawable.frame_03, R.drawable.frame_04, R.drawable.frame_05, R.drawable.frame_06, R.drawable.frame_07, R.drawable.frame_08, R.drawable.frame_09, R.drawable.frame_10, R.drawable.frame_11, R.drawable.frame_12, R.drawable.frame_13, }; AnimationDrawable animationDrawable = new AnimationDrawable(); Resources resources = getResources(); for (int resId : resIds) { animationDrawable.addFrame(resources.getDrawable(resId), 90); } image.setImageDrawable(animationDrawable); animationDrawable.start();
還是使用xml方便一些。
屬性
xml | Java方法 | 引數 | 描述 |
---|---|---|---|
android:drawable | addFrame第一個引數 | xml為drawable資源,java引數為Drawable物件 | 動畫每一幀的資原始檔 |
android:duration | addFrame第二個引數 | int | 當前幀持續時間 |
android:oneshot | setOneShot | boolean,預設為false | 如果為true,則動畫將僅執行一次然後停止 |
記憶體開銷問題
幾乎所有關於朱楨動畫的文章都會提及OOM問題,下面的截圖是關於我這個例子記憶體變化。

記憶體變化.png
可以看到動畫播放前後,記憶體開銷突然增加了38.20MB - 30.02MB = 8.18MB,且增加的基本都是Graphics(影象快取等,包括GL surfaces, GL textures等)。所以使用逐幀動畫的時候,還是量力而行,儘量不要使用太大的圖片。