0

私はいつもこのエラーを受け取ります。ご覧のとおり、stackoverflow.comにはすでに多くの質問がありますが、残念ながら、自分に合った答えは見つかりません。

アニメーションに入れたいPNG画像が60枚(全部で2,5MB)あります。

私は3つの異なる方法で試しました。

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>

Java

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 は、そのような大量の使用を意図したものではありません。SurfaceView を調べ始めると、アニメーションの表示に使用するメモリ管理方法を自由に実装できるようになります。

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

幸運を。

于 2012-04-05T14:43:25.553 に答える
0

場合によっては、スタック トレースに表示されるコード行以外の場所からメモリ リークが発生することがあります。以下の記事を注意深く読んでから、独自のコードをチェックして、次のような特別な問題を省略してください。

  • コンテキスト アクティビティへの長期間の参照を保持しないでください (アクティビティへの参照は、アクティビティ自体と同じライフ サイクルを持つ必要があります)。
  • context-activity の代わりに context-application を使用してみてください
  • ライフ サイクルを制御しない場合は、アクティビティ内の非静的内部クラスを避け、静的内部クラスを使用して内部のアクティビティへの弱参照を作成します。この問題の解決策は、ViewRoot とその W 内部クラスで行われているように、外部クラスへの WeakReference を持つ静的内部クラスを使用することです**

論文

編集:これらも確認する必要があります:

  • recycle() を呼び出して未使用のビットマップを削除する

  • ビットマップのサイズを小さくするには、sampleSize > 1 を使用します。

Bitmap.createBitmap(幅、高さ、新しい BitmapFactory.Options().inSampleSize=4)

于 2012-04-05T15:31:12.197 に答える