0

我一直收到这个错误。正如我所看到的,stackoverflow.com 上已经有很多问题,但遗憾的是,我找不到任何适合我的答案。

我有 60 张 PNG 图像(总共 2.5MB),我想把它们放在动画中。

我尝试了三种不同的方式。

1

mAnimation = new AnimationDrawable();
mAnimation.addFrame((BitmapDrawable)getResources().getDrawable(R.drawable.yawning_00001), FPS_12);  
...
mAnimation.addFrame((BitmapDrawable)getResources().getDrawable(R.drawable.yawning_00063), FPS_12);
mAnimation.start();

2

XML

<animation-list android:oneshot="true">
    <item android:drawable="@drawable/yawning_00001" android:duration="83" />
    ...
    <item android:drawable="@drawable/yawning_00063" android:duration="83" />
 </animation-list>

爪哇

ImageView img = (ImageView)findViewById(R.id.animation);
img.setBackgroundResource(R.drawable.yawning);
AnimationDrawable frameAnimation = (AnimationDrawable) img.getBackground();
frameAnimation.start();

3

随着类扩展 ImageView(我将在这里只展示重要的东西)

public void loadAnimation(String prefix, int nframes) {
    mBitmapList.clear();
    for (int x = 0; x < nframes; x++) {
        String zeros = "000";
        if (x < 10) {
            zeros += "0";
        }
        String name = prefix + "_" + zeros + x;
        Log.d(TAG, "loading animation frame: " + name);
        int res_id = mContext.getResources().getIdentifier(name, "drawable", mContext.getPackageName());
        d = (BitmapDrawable) mContext.getResources().getDrawable(res_id);
        mBitmapList.add(d.getBitmap());
    }
}

在所有情况下,我都会遇到相同的错误......在加载 15 张图片后出现了一些错误。

E/AndroidRuntime(1591): java.lang.OutOfMemoryError: bitmap size exceeds VM budget

我想知道这是否是帧动画甚至在 Android 中也是可能的。

有没有人可以替代逐帧动画?如果是,请链接到任何展示。

4

2 回答 2

4

您将需要以某种方式回收图像,因为您将没有足够的内存来存储 60 张图像。

您认为您的图像加在一起是 2.5 兆,但这是文件的压缩 png 版本。

如果您想知道在内存中以位图格式解压缩时文件使用了多少内存,只需执行以下操作:宽度*高度*图像数量*每像素字节数......然后你就会知道为什么会崩溃:D

AnimationDrawable 不适合这种大量使用。您应该开始查看 SurfaceViews,然后您就可以自由地实现您想要用来显示动画的任何内存管理方法。

http://developer.android.com/reference/android/view/SurfaceView.html

祝你好运。

于 2012-04-05T14:43:25.553 回答
0

有时,内存泄漏来自堆栈跟踪中未显示的代码行。我认为您应该仔细阅读下面的文章,然后检查您自己的代码以省略一些特殊问题,例如:

  • 不要保留对上下文活动的长期引用(对活动的引用应该与活动本身具有相同的生命周期)
  • 尝试使用上下文应用程序而不是上下文活动
  • 如果您不控制它们的生命周期,请避免在活动中使用非静态内部类,使用静态内部类并对内部活动进行弱引用。此问题的解决方案是使用静态内部类和对外部类的 WeakReference,例如在 ViewRoot 及其 W 内部类中所做的**

文章

编辑:您还应该检查这些:

  • 调用 recycle() 删除未使用的位图

  • 使用 sampleSize > 1 来减小位图大小。

Bitmap.createBitmap(width, height, new BitmapFactory.Options().inSampleSize=4)

于 2012-04-05T15:31:12.197 回答