Android 幀動畫OOM問題優化

2021-07-25 16:56:41 字數 1941 閱讀 8878

xmlns:android=""

android:oneshot="false" >

android:drawable="@drawable/img0"

android:duration="17" />

android:drawable="@drawable/img1"

android:duration="17" />

android:drawable="@drawable/img2"

android:duration="17" />

animation-list>

animationdrawable animationdrawable;

if (imageview.getdrawable() == null)

animationdrawable.start();//開始

animationdrawable.stop();//結束

. 記憶體溢位咋辦

用普通方法實現幀動畫用到普通場景是沒問題的,如果碰到幾十甚至幾百幀,而且每張幾百k的情況,呵呵。例如,做乙個很炫的閃屏幀動畫,要保證高畫質且動作絲滑,就需要至少幾十張高畫質。這時,oom問題就出來了,閃屏進化成了一閃~

別慌,像我這樣的菜鳥遇到問題就會找度娘和gayhub,大神們肯定已經有解決方案了。隨手一搜就在stackoverflow上找到了解決辦法:

public

synchronized

void

start()

return;

}misrunning = true;

//新開執行緒去讀下一幀

mhandler.postdelayed(this, mdelaymillis);

if (imageview.isshown()) catch (exception e)

if (bitmap != null) else

} else }}

};mhandler.post(runnable);

}

. 進一步優化

為了快速讀取sd卡中的資源,這裡用到了apache的ioutils。在位圖處理上使用了bitmapfactory.options()相關設定,inbitmap,當大小型別相同時,虛擬機器就對位圖進行記憶體復用,不再分配新的記憶體,可以避免不必要的記憶體分配及gc。

if (build.version

.sdk_int >= 11)

將大神的**整理搬運後,整合成demo到自己github上,具體專案請移步

使用很簡單:

/**

* 將幀動畫資源id以字串陣列形式寫到values/arrays.xml中

*/animationscontainer.framessequenceanimation animation

= animationscontainer.getinstance(r.array.***, fps).createprogressdialoganim(imageview);

animation.start();//動畫開始

animation.stop();//動畫結束

注意資源id需要以string陣列形式放入xml中,然後再利用typedarray將字串轉為資源id。如果直接用@drawable/img1這樣的形式放入int陣列中,是沒法讀取到正真的資源id的。

從xml中讀取資源id陣列**:

/**

* 從xml中讀取幀陣列

*@param resid

*@return

*/private

int getdata(int resid)

array.recycle();

return intarray;

}

Android 幀動畫OOM問題優化

animationdrawable animationdrawable if imageview.getdrawable null animationdrawable.start 開始 animationdrawable.stop 結束 oom問題及優化 記憶體溢位咋辦 用普通方法實現幀動畫用到普通...

Android動畫 幀動畫

首先在res中新建乙個drawable資料夾,將需要展示的放在裡面,同樣的還有展示的fight.xml檔案,如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 ...

Android動畫之幀動畫詳解

xml資源檔案方式 1.在res drawable目錄中放入需要的 3.在布局檔案中進行設定animationdrawable animationdrawable animationdrawable imageview.getbackground 開始動畫 animationdrawable.sta...