3

だからここに取引があります、私はすべての質問とリンクをオンラインで検索しましたが、どれも役に立ちません。スプラッシュ画面用に.jpg形式のアニメーションの120フレームがあります。jpegがメモリ上でビットマップに変換されることを理解しているので、OutOfMemoryErrorが発生します。アニメーション化できる最大フレーム数は10です。このフレームごとにこの方法を実行する方法はありますか、それとも別の方法を試す必要がありますか。これが私のコードです:

    final AnimationDrawable anim = new AnimationDrawable();
    anim.setOneShot(true);

    for (int i = 1; i <= 120; i++) 
    {
        Drawable logo = getResources().getDrawable(getResources()
                  .getIdentifier("l"+i, "drawable", getPackageName()));

        anim.addFrame(logo, 50);
        if (i % 3 == 0)
        {
            System.gc();
        }
    }

    ImageView myImageView = (ImageView) findViewById(R.id.SplashImageView);
    myImageView.setBackgroundDrawable(anim);
    myImageView.post(new Runnable()
    {
       public void run()
       {
          anim.start();
       }
    });

120個のjpegを、「l」プレフィックスが付いたドローアブルフォルダの下に配置しました(例:l1、l2など)。私は3jpegごとにガベージコレクションを行いますが、それでは何も起こりません。

4

3 に答える 3

4

AnimationDrawableを使用せずに試すことができますHandler.postDelayed。このようなもの:

final ImageView image = (ImageView) findViewById(R.id.SplashImageView);
final Handler handler = new Handler();

final Runnable animation = new Runnable() {
    private static final int MAX = 120;
    private static final int DELAY = 50;

    private int current = 0;

    @Override
    public void run() {
        final Resources resources = getResources();
        final int id = resources.getIdentifier("l" + current, "drawable", getPackageName());
        final Drawable drawable = resources.getDrawable(id);

        image.setBackgroundDrawable(drawable);
        handler.postDelayed(this, DELAY);
        current = (current + 1) % MAX;
    }
};

handler.post(animation);

このソリューションでは、一度に1つの描画可能しか保持されないため、必要なメモリが少なくて済みます。

を使用してアニメーションをキャンセルできますhandler.removeCallbacks(animation);

ワンショットアニメーションを作成したい場合は、handler.postDelayed条件付きで呼び出すことができます。

if (current != MAX - 1) {
    handler.postDelayed(this, DELAY);
}
于 2013-01-15T15:22:51.733 に答える
1

私はそれらの解決策をすべて試しましたが、それぞれが良くなりました:Dより多くのフレームとより多くの解像度を使用できましたが、それでもマネージャーには満足できません:(フレームの代わりにビデオを使用するのが最善の解決策であり、メモリの少ないデバイスでも魅力のように機能しますxperia uで256MBのRAMを搭載したビデオコーデック(H.264 mp4)を使用して、サイズ480*854の各150フレームをテストしました。

于 2013-03-17T08:19:16.817 に答える
1

もし、必要にコール̶.̶r̶e̶c̶y̶c̶l̶e̶(̶)̶ON THEビットマップあなたドント使用̶a̶n̶y̶m̶o̶r̶e̶.̶さもなければ習慣ことごみ収集̶p̶r̶o̶p̶e̶r̶l̶y̶.̶

また、マニフェストセットでは、trueに大きなヒープを使用します。これにより、呼吸するためのスペースが少し増えます。>)

于 2013-01-15T15:05:54.900 に答える