Android:如何使用大量的位图?

3

我正在将一幅逐帧动画绘制到画布上,我有大约100张图片可以用来完成这个过程(总共大约1.5MB)。我最初的做法是:

s000 = BitmapFactory.decodeResource(getResources(), R.drawable.s0);
s001 = BitmapFactory.decodeResource(getResources(), R.drawable.s1); ...etc...

将每个图像绘制到画布上:
c.drawBitmap(s000, X, Y, null);

制作动画。

问题在于我收到了这个错误信息:“OutOfMemoryError:bitmap size exceeds VM budget”。我该如何加载所有图片,而不会出现此错误?1.5MB 的内存是否太多,或者我有内存泄漏?我应该怎么做来解决内存泄漏?

非常感谢您的帮助。由于我是 Android 方面的新手,所以能否请您留下示例,而不仅仅是告诉我要做一些我无法理解的事情 :) 再次感谢。

3个回答

2

在绘制每一帧时,请尝试按照以下方式操作:

s000 = BitmapFactory.decodeResource(getResources(), R.drawable.s0);
c.drawBitmap(s000, X, Y, null);
s000.recycle();
s000 = null;

这将在绘制帧后尝试释放内存。

编辑

myImgLen = 30;
Bitmap bitmap = null;
for (int i = 0; i < myImgLen; i++) {
    bitmap = BitmapFactory.decodeResource(getResources(), getResource‌​s().getIdentifier("s" + i, "drawable", getPackageName()));
    c.drawBitmap(bitmap, X, Y, null);
    bitmap.recycle();
    bitmap = null;
}

谢谢你的帮助,但现在我有一个新问题。我的动画循环播放,并且我一遍又一遍地使用相同的位图,所以如果我回收它,那么就会出现错误。在我的应用程序开始时,我像这样解码所有位图:int myImgLen = 30; for (int i = 0; i < myImgLen; i++) myList.add(BitmapFactory.decodeResource(this.getResources(), this.getResources().getIdentifier("s" + i, "drawable", getPackageName()))); 你知道我怎么才能在绘制每个位图之前解码它吗? - alexward1230
我简直无法相信,像回收位图这样简单的事情竟然给我带来了这么多麻烦。非常感谢你的帮助,现在它终于能正常工作了!耶!顺便说一下,虽然它能工作,但由于每帧都要重新加载位图,所以有点卡顿/慢。你有什么关于如何使其更流畅的建议/指导吗,智者? - alexward1230

0

它们存储在那里(或在hdpi中),但是要将它们绘制到画布上,我必须对每个图像执行以下操作:Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.s0); 我认为这就是问题所在。 - alexward1230
你需要在res文件夹内创建“drawable-xhdpi”文件夹。通常有hdpi(高)和xhdpi(特别高)两种像素密度。由于你的图像大小为1.5 mb,因此你需要在res文件夹内创建drawable-xhdpi文件夹。 - Bhargav Panchal
但是我的图像总共有1.5MB(而且有很多),每个图像都是480x800,应该放在hdpi文件夹中。我想... - alexward1230

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接