私は問題があります。メインメニュー/スタート画面に大きなグラフィックがあります。これにより、一部の古いデバイスでメモリ不足の例外が発生します。これは解像度が 1920*1080 の PNG ファイルで、ImageFormat RGB565 を使用しています。使用済みRAMを減らす方法はありますか?
2 に答える
前述のように、画像を縮小できますが、何らかの理由で縮小したくない場合、または縮小できない場合は、そのリンクを確認することをお勧めします。
http://developer.android.com/training/displaying-bitmaps/index.html
また、追加することもできます
largeHeap=true
メモリを少し増やすには、新しいデバイスでのみ機能しますが、Android 2.x はそれをサポートしていません
これはあなたが探しているものです:
BitmapFactory.Options.inSampleSize
これが true に設定されている場合、結果のビットマップは、システムがメモリを再利用する必要がある場合にパージできるようにピクセルを割り当てます。その場合、ピクセルに再びアクセスする必要がある場合 (たとえば、ビットマップが描画され、getPixels() が呼び出される)、ピクセルは自動的に再デコードされます。再デコードを行うには、入力への参照を共有するか、そのコピーを作成することにより、ビットマップがエンコードされたデータにアクセスできる必要があります。この区別は inInputShareable によって制御されます。これが true の場合、ビットマップは入力への浅い参照を保持できます。これが false の場合、ビットマップは明示的に入力データのコピーを作成し、それを保持します。共有が許可されている場合でも、実装は入力データのディープ コピーを作成することを決定する場合があります。
ソース: http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inSampleSize
inSampleSize
したがって、基本的には、画面の解像度と使用可能な RAM に基づいてを調整して、特定のデバイスに適切なバージョンのビットマップを常に使用できるようにすることができます。OutOfMemoryError
これにより、エラーが発生するのを防ぐことができます。
これを利用する方法の例を次に示します。
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
int reqWidth, int reqHeight) {
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);
}
public static int calculateInSampleSize(
BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
// Calculate ratios of height and width to requested height and width
final int heightRatio = Math.round((float) height / (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);
// Choose the smallest ratio as inSampleSize value, this will guarantee
// a final image with both dimensions larger than or equal to the
// requested height and width.
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
}
ソース: http://developer.android.com/training/displaying-bitmaps/load-bitmap.html そのリンクの下にさらに詳しい情報もありますので、チェックすることをお勧めします。