0

画面にスプライト シート アニメーションを描画しようとしていますが、このコードを使用していたときは問題なく動作していました。

    canvas.drawColor(Color.TRANSPARENT);
    Rect src = new Rect(CurrentSprite.x * SheetSize.x, CurrentSprite.y * SheetSize.y, (CurrentSprite.x * SheetSize.x) + SheetSize.x, (CurrentSprite.y * SheetSize.y) + SheetSize.y);
    Rect dst = new Rect(X, Y, X + SheetSize.x, Y + SheetSize.y);
    canvas.drawBitmap(bmp, src, dst, null);

ただし、画面に描画する前に画像を回転させる必要があります。コードを変更して、スプライトのローカル コピーを作成します。これを描くつもりですが、ここで問題が発生します。Bitmap.createBitmap メソッドを使用していますが、画面を見ると完全なスプライト シートが画面に描画され、OutOfMemoryException が発生することがあるため、このメソッドは何もしないようです (完全な画像が非常に大きいため理解できます)。

    canvas.drawColor(Color.TRANSPARENT);
    Matrix matrix = new Matrix();
    matrix.postRotate(Degrees);
    Bitmap tempAnimationBmp = Bitmap.createBitmap(bmp, CurrentSprite.x * SheetSize.x, CurrentSprite.y * SheetSize.y, (CurrentSprite.x * SheetSize.x) + SheetSize.x, (CurrentSprite.y * SheetSize.y) + SheetSize.y, matrix, true);
    canvas.drawBitmap(tempAnimationBmp, X, Y, null);
    tempAnimationBmp.recycle();

完全なスプライト シートを取得するのはなぜですか?

4

1 に答える 1

0

たくさんのビットマップを作成しようとする代わりに、 DrawableContainerのいずれかを使用することをお勧めします。Drawable の使い方はとても簡単です。サイズを設定してキャンバスに渡すだけで、キャンバスのその場所に描画されます。Drawables の優れた点は、非常に簡単に作成できることです。そのため、システムからリソースを取得し、その領域のみをキャンバスに描画するカスタム SpriteDrawable クラスを作成できます。

たくさんのビットマップを作成しようとする代わりにこのフローに取り組むことで、大量のメモリを節約でき、Android のグラフィック システムでより多くの作業を行おうとすると、多くの頭痛の種になる可能性があります。

于 2012-09-26T18:46:46.973 に答える