1

アニメーションをライブ壁紙として表示する最良の方法は何ですか? 現在、GIFを11個のpng(フレームごとに1つ)に分割しています。

public Bitmap frame0;
ArrayList<Bitmap> frameArray = new ArrayList<Bitmap>();
frame0 = BitmapFactory.decodeResource(getResources(), R.drawable.nyancat0);
frame0 = Bitmap.createScaledBitmap(frame0, minWidth, minHeight, true);
frameArray.add(frame0);

次に、For ループを使用してフレームをループし、キャンバスに描画します。

canvas.drawBitmap(frameArray.get(indexnumber), 0, 0, mPaint);

そして、indexnumber++ が 11 でない限り変更し、その後 1 に戻ります。これは機能しますが、もちろん、多くのビットマップを格納することはメモリ効率が非常に悪くなります。これにより、遅延やバッテリーの消耗なしに、複数のレイヤーやその他のクールな効果を実行できなくなります。Android ライブ壁紙にアニメーションを表示するより良い方法はありますか? GIF全体を表示するためにムービーを試しましたが、ライブ壁紙ではサポートされていません。

4

2 に答える 2

1

画像の読み込みにはどのくらい時間がかかりますか? 無視できる場合は、表示する直前に各画像をロードして、古い画像を破棄してみませんか? そうすれば、どの段階でもメモリ内に 1 つのイメージしかありません。

または、バック バッファーを使用するようなことを行い、メモリに 2 つのスペースを用意します。1 つは現在表示されている画像用で、もう 1 つは次の画像を読み込むためのものです。変更するときは、新しくロードされたビットマップを表示し、他のビットマップをアンロードしてから、次のフレームをそれにロードします。

于 2012-04-12T23:58:54.163 に答える
0

人々が何と言おうと、実際にはライブ壁紙にたくさんの画像を含めることができます。唯一のトリッキーなことは、メモリ制限です。アプリケーションに 40 個もの .png をロードし、1 分に 1 回リロードしました。

しかし、アプリケーションで非常に多くの画像を処理する場合は、スマートな方法でそれらをロードする必要があります。

public BitmapResult decodeResource(int file, int scale){
        //Decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inPurgeable = true;
        o.inInputShareable = true;
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(resources, file, o);

        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inPreferredConfig = Bitmap.Config.ARGB_8888;
        o2.inSampleSize=scale;
        return new BitmapResult(BitmapFactory.decodeResource(resources, file, o2),o2.outWidth,o2.outHeight);
}

スケール変数がわかりますか?これは 2 のべき乗である必要があり、ビットマップを縮小します。

問題が発生した場合は、ビットマップを消去し、ビットマップを低品質で再ロードします。

void init()
{
    try
    {
         loadFirstBitmap();
         loadSecondBitmap();
    }
    catch(java.lang.OutOfMemoryError error)
    {
         /*some infinite loop breaker*/
         scale *= 2;
         cleanup();
         init();
    }
}

また、システムはビットマップを削除しません。自分でビットマップを消去してから、おそらくガベージ コレクターを呼び出す必要があります。

bitmap1.recycle();
bitmap2.recycle();
System.gc();

ビットマップを必要なサイズにサイズ変更することも良い考えです。そうしないと、描画しようとするたびにシステムが createScaledBitmap を呼び出し、追加のメモリが必要になるからです。

そのような種類のアプリのメモリ上限が何であるか、ほとんどの場合 24 MB に等しいメモリ ヒープ制限が何であるかはわかりませんでしたが、私のアプリは最大 13 MB のメモリを消費し、誰もクラッシュを報告したことはありません。 Android デバイス >= 2.2。

したがって、いくつかの最適化ルールに従えば、アプリケーションに必要な数のビットマップをロードできます。

于 2012-05-20T21:07:32.640 に答える