Android DrawableAnimation逐帧动画加载多图(OOM的解决)

来源:互联网 发布:德国人怀念希特勒 知乎 编辑:程序博客网 时间:2024/06/07 23:45

想做一个逐帧动画,用了一百来张图片,结果内存溢出了,找了半天最后算是解决了。

本来是在drawable里面写一个animation-list,设置ImageView的backgroud,

然后在Activity里面

animationDrawable = (AnimationDrawable)mImageView.getBackground();
animationDrawable.start();
但是图片多了就会内存溢出了。


最后采用的解决办法是这个http://www.kankanews.com/ICkengine/archives/86482.shtml

稍微改动了一下。

里面有三个构造方法,和两个播放的方法,直接构造就可以播放动画了

package com.example.animationoom;import android.os.Handler;import android.widget.ImageView;public class SceneAnimation  {private ImageView mImageView;private int[] mFrameRess;// 图片private int[] mDurations;private int mDuration;private Handler handler = new Handler();Runnable mRunnable;private int mLastFrameNo;private long mBreakDelay;//参数包括pDurations数组,执行播放play(1);public SceneAnimation(ImageView pImageView, int[] pFrameRess, int[] pDurations) {mImageView = pImageView;mFrameRess = pFrameRess;mDurations = pDurations;mLastFrameNo = pFrameRess.length - 1;mImageView.setBackgroundResource(mFrameRess[0]);play(1);}//参数包括一个int 的执行时间 pDuration, 执行循环播放playConstant(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);}//参数包括一个int的pDuration,一个long的pBreakDelay,表示每次播放的间隔,执行循环播放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) {mRunnable = new Runnable() {public void run() {mImageView.setBackgroundResource(mFrameRess[pFrameNo]);if (pFrameNo == mLastFrameNo)play(0);elseplay(pFrameNo + 1);}};handler.postDelayed( mRunnable, mDurations[pFrameNo]);}private void playConstant(final int pFrameNo) {Handler handler = new Handler();handler.postDelayed(new Runnable() {public void run() {mImageView.setBackgroundResource(mFrameRess[pFrameNo]);if (pFrameNo == mLastFrameNo)playConstant(0);elseplayConstant(pFrameNo + 1);}}, pFrameNo == mLastFrameNo && mBreakDelay > 0 ? mBreakDelay : mDuration);}};

但是这样的方法还是有问题,在加载图片的时候,会有卡顿的现象。

而且目前是不能实现单词播放的,还需要做些改动。

0 2