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

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

本来是在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);
				else
					play(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);
				else
					playConstant(pFrameNo + 1);
			}
		}, pFrameNo == mLastFrameNo && mBreakDelay > 0 ? mBreakDelay : mDuration);
	}
	

};

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

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值