0

Android ゲームを作成していますが、ビットマップをロードするとメモリ エラーが発生します。これは非常に大きなビットマップ (ゲームの背景) が原因であることはわかっていますが、「ビットマップ サイズが VM 予算を拡張します」というエラーが発生しないようにする方法がわかりません。背景を小さくできないため、ビットマップを再スケーリングして小さくすることはできません。助言がありますか?

そうそう、エラーの原因となるコードは次のとおりです。

space = BitmapFactory.decodeResource(context.getResources(),
            R.drawable.background);
    space = Bitmap.createScaledBitmap(space,
            (int) (space.getWidth() * widthRatio),
            (int) (space.getHeight() * heightRatio), false);
4

3 に答える 3

0

これはあなたを助けるかもしれません: http://developer.android.com/training/displaying-bitmaps/index.html

Android Developer Website から、ビットマップやその他のものを効率的に表示する方法に関するチュートリアル。=]

于 2012-09-01T04:13:26.340 に答える
0

画像をサンプリングする必要があります。明らかに、画面よりも小さく「縮小」することはできませんが、小さな画面などでは、大きな画面ほど高解像度である必要はありません。

簡単に言えば、ダウンサンプリングするには inSampleSize オプションを使用する必要があります。画像が画面に収まる場合、実際には非常に簡単なはずです。

    final WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    final Display display = wm.getDefaultDisplay();

    final int dimension = Math.max(display.getHeight(), display.getWidth());

    final Options opt = new BitmapFactory.Options();
    opt.inJustDecodeBounds = true;

    InputStream bitmapStream = /* input stream for bitmap */;
    BitmapFactory.decodeStream(bitmapStream, null, opt);
    try
    {
        bitmapStream.close();
    }
    catch (final IOException e)
    {
        // ignore
    }

    final int imageHeight = opt.outHeight;
    final int imageWidth = opt.outWidth;

    int exactSampleSize = 1;
    if (imageHeight > dimension || imageWidth > dimension)
    {
        if (imageWidth > imageHeight)
        {
            exactSampleSize = Math.round((float) imageHeight / (float) dimension);
        }
        else
        {
            exactSampleSize = Math.round((float) imageWidth / (float) dimension);
        }
    }

    opt.inSampleSize = exactSampleSize; // if you find a nearest power of 2, the sampling will be more efficient... on the other hand math is hard.
    opt.inJustDecodeBounds = false;

    bitmapStream = /* new input stream for bitmap, make sure not to re-use the stream from above or this won't work */;
    final Bitmap img = BitmapFactory.decodeStream(bitmapStream, null, opt);

    /* Now go clean up your open streams... : ) */

それが役立つことを願っています。

于 2012-09-01T02:58:25.063 に答える
0
  • なぜあなたが使用しているのかわかりませんImageBitmapか?背景用。必要に応じて、大丈夫です。それ以外の場合Layoutは、背景画像を使用しているため、その背景を使用して設定してください。これは重要。(Androidのドキュメントを確認してください。この問題は明確に示されています。)

次の方法でこれを行うことができます

 Drawable d = getResources().getDrawable(R.drawable.your_background);
 backgroundRelativeLayout.setBackgroundDrawable(d);
于 2012-09-01T05:15:36.897 に答える