0

AnimationDrawable同じアクティビティで2 を開始すると、メモリ エラーが発生します。画像のサイズ (幅 = 画面の幅) を縮小しましたが、品質が低下するため、それ以上縮小することはできません。たとえば、幅 = 画面の幅 / 2 とすると、機能しますが、品質はひどいものになります。

logcat には次のように書かれています。

02-19 10:56:44.769: E/dalvikvm-heap(3118): 383916-byte external allocation too large for this process.
02-19 10:56:44.809: E/GraphicsJNI(3118): VM won't let us allocate 383916 bytes
02-19 10:56:44.809: W/dalvikvm(3118): threadid=1: thread exiting with uncaught exception (group=0x40018560)
02-19 10:56:44.819: E/AndroidRuntime(3118): FATAL EXCEPTION: main
02-19 10:56:44.819: E/AndroidRuntime(3118): java.lang.OutOfMemoryError: bitmap size exceeds VM budget

メモリ リークはないと思いますが、この記事をチェックして、潜在的なメモリ リークを検出しようとしましたが、そうではないようです。

このプロジェクトでの最初のメモリエラーではなく、常にそれを処理するのに苦労しているため、本当に助けが必要です。

これが私のコードです:

private void startAnimation(AnimationDrawable animation1,
        AnimationDrawable animation2) {
    int drawables[] = new int[] { R.drawable.fire1, R.drawable.fire2,
            R.drawable.fire3, R.drawable.fire4, R.drawable.fire5,
            R.drawable.fire6, R.drawable.fire7, R.drawable.fire8,
            R.drawable.fire9, R.drawable.fire10down2,
            R.drawable.fire11down2, R.drawable.fire12down2,
            R.drawable.fire13down2, R.drawable.fire14down2,
            R.drawable.fire15down2, R.drawable.fire16down2 };
    int drawables2[] = new int[] { R.drawable.fire14down2,
            R.drawable.fire14down2, R.drawable.fire14down2,
            R.drawable.fire14down2, R.drawable.fire14down2,
            R.drawable.fire14down2, R.drawable.fire14down2,
            R.drawable.fire14down2, R.drawable.fire14down2,
            R.drawable.fire10up, R.drawable.fire11up, R.drawable.fire12up,
            R.drawable.fire13up, R.drawable.fire14up, R.drawable.fire15up,
            R.drawable.fire16up };
    bitmapDrawable = new BitmapDrawable[drawables.length];
    bitmapDrawable2 = new BitmapDrawable[drawables2.length];
    for (int i = 0; i < drawables.length; i++) {
        bitmapDrawable[i] = new BitmapDrawable(
                decodeSampledBitmapFromResource(getResources(),
                        drawables[i], width));
        Log.w("BITMAP", "i=" + i);
        bitmapDrawable2[i] = new BitmapDrawable(
                decodeSampledBitmapFromResource(getResources(),
                        drawables2[i], width));
        animation1.addFrame(bitmapDrawable[i], 50);
        animation2.addFrame(bitmapDrawable2[i], 50);
    }
    animation1.setOneShot(true);
    animation2.setOneShot(true);
    image2.setLayoutParams(params);
    image2.setImageDrawable(animation1);
    image2.post(new Starter(animation1));
    image3.setLayoutParams(params);
    image3.setImageDrawable(animation2);
    image3.post(new Starter(animation2));
}

class Starter implements Runnable {

    AnimationDrawable animation = new AnimationDrawable();

    public Starter(AnimationDrawable animation) {
        this.animation = animation;
    }

    public void run() {
        animation.start();
    }
}

どうすればビットマップの重量を減らすことができますか (必要な場合? 問題は別の場所にある可能性があります - そして画像の品質を維持しますか? 問題がどこにあるのかわかりません。私は 30 枚の画像しか使用しません。他のアプリは多くの画像を使用します)もっと! それを行う別の方法はありますか?

4

1 に答える 1

0

画面サイズ全体の画像を使用してアニメーション化する場合は、(ほとんどの場合)デバイスのメモリをオーバーランするため、品質を下げることはあまり役に立ちません。

私が自分のアニメーションでしたことは、次のことでした。

  • 一定の背景画像を使用しました。
  • アニメーションで絶えず変化していた小さな領域を抽出しました
  • アニメーションで変化する独立した小さな画像を作成しました
  • 一定の背景画像を使用して、小さな画像を使用してアニメーション化する
于 2013-02-20T09:41:50.433 に答える