У меня есть изображение с высоким разрешением (2588 * 1603) в выделенной папке. Если я использую ниже код (1), чтобы установить его для ImageView я не получаю исключение OOM и изображения, присвоенного как ожидалось:Почему я НЕ получаю исключение из памяти?
public class MainActivity extends ActionBarActivity{
private ImageView mImageView;
int mImageHeight = 0;
int mImageWidth = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImageView = (ImageView) findViewById(R.id.imageView);
mImageView.setScaleType(ScaleType.FIT_CENTER);
BitmapFactory.Options sizeOption = new BitmapFactory.Options();
sizeOption.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.drawable.a, sizeOption);
mImageHeight = sizeOption.outHeight;
mImageWidth = sizeOption.outWidth;
mImageView.post(new Runnable() {
@Override
public void run() {
try {
BitmapRegionDecoder bmpDecoder = BitmapRegionDecoder
.newInstance(getResources().openRawResource(R.drawable.a),true);
Rect rect = new Rect(0,0,mImageWidth, mImageHeight);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
options.inDensity = getResources().getDisplayMetrics().densityDpi;
Bitmap bmp = bmpDecoder.decodeRegion(rect, options);
mImageView.setImageBitmap(bmp);
} catch (NotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
}
Обратите внимание, что размер Прямоугольник точно так же, как размер изображения.
Но если я использую другие методы, например, 2 или 3, я получаю OOM.
2) mImageView.setBackgroundResource(R.drawable.a);
3) Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.a);
mImageView.setImageBitmap(bmp);
В чем разница между 1 и 2,3?
(я знаю, как решить OOM, я просто хочу знать разницу)
Какой конечный результат? Вы видите весь растровый рисунок или только часть его. Мое предположение заключается в том, что decodeRegion обрабатывает растровое изображение, если прямоугольник превышает размер экрана. – Blackbelt
@Blackbelt да. Я вижу весь битмап как дозу ScaleType.FIT_CENTER с обычным «Bitmap». – mmlooloo
, то, вероятно, 'decodeRegion' игнорирует плотность экрана – Blackbelt