当用帧动画来加载多张图片时 常用
当设备配置比较低时常常会发生OOM异常,这是因为加载帧动画时将所有的图片加载到内存中所以会发生OOM,如何去解决这个问题:如下`public class SceneAnimation {
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>R.drawable.xxx</item>
.
.
.
</animation-list>
private ImageView mImageView;
private int[] mFrameRess;
private int[] mDurations;
private int mDuration;
private int mLastFrameNo;
private long mBreakDelay;
public SceneAnimation(ImageView pImageView, int[] pFrameRess,
int[] pDurations) {
mImageView = pImageView;
mFrameRess = pFrameRess;
mDurations = pDurations;
mLastFrameNo = pFrameRess.length - 1;
mImageView.setBackgroundResource(mFrameRess[0]);
play(1);
}
public SceneAnimation(ImageView pImageView, int[] pFrameRess, int pDuration) {
mImageView = pImageView;
mFrameRess = pFrameRess;
mDuration = pDuration;
mLastFrameNo = pFrameRess.length - 1;
mImageView.setBackgroundResource(mFrameRess[0]);
playConstant(1);
}
public SceneAnimation(ImageView pImageView, int[] pFrameRess,
int pDuration, long pBreakDelay) {
mImageView = pImageView;
mFrameRess = pFrameRess;
mDuration = pDuration;
mLastFrameNo = pFrameRess.length - 1;
mBreakDelay = pBreakDelay;
mImageView.setBackgroundResource(mFrameRess[0]);
playConstant(1);
}
private void play(final int pFrameNo) {
mImageView.postDelayed(new Runnable() {
public void run() {
mImageView.setBackgroundResource(mFrameRess[pFrameNo]);
if (pFrameNo == mLastFrameNo)
play(0);
else
play(pFrameNo + 1);
}
}, mDurations[pFrameNo]);
}
private void playConstant(final int pFrameNo) {
mImageView.postDelayed(new Runnable() {
public void run() {
mImageView.setBackgroundResource(mFrameRess[pFrameNo]);
if (pFrameNo == mLastFrameNo)
playConstant(0);
else
playConstant(pFrameNo + 1);
}
}, pFrameNo == mLastFrameNo && mBreakDelay > 0 ? mBreakDelay
: mDuration);
}
};
`
这是网上常用的一种方式,利用postDelayed 控制每帧的显示时间,所有图片一个一个的set到imageview中,这样可以一张一张顺序的加载,不需要全部加载到内存, 大大降低内存消耗,其实还是希望能够在animationDrawable 中进行分布加载,如果有大牛对animationDrawable修改后可以防止oom的,可以指导指导。