Android 幀動畫OOM問題優化

2021-09-28 11:29:56 字數 1764 閱讀 9453

animationdrawable animationdrawable;

if (imageview.getdrawable() == null)

animationdrawable.start();//開始

animationdrawable.stop();//結束       

oom問題及優化

. 記憶體溢位咋辦

用普通方法實現幀動畫用到普通場景是沒問題的,如果碰到幾十甚至幾百幀,而且每張幾百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上,具體專案請移步 

使用很簡單:

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;

}實現效果

實現完了當然迫不及待的到真機上跑跑,測下效果。 

看圖說話,這麼明顯的坎兒就是應為一次讀取造成的,分分鐘oom的節奏。再看看優化後的結果: 

是不是很養眼,不過最前面剛進介面時的蜜汁gc我還沒弄清除~~ 

最後奉上**效果,是不是非常絲滑酸爽 

Android 幀動畫OOM問題優化

xmlns android android oneshot false android drawable drawable img0 android duration 17 android drawable drawable img1 android duration 17 android draw...

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...