我在drawable文件夹中有一张高分辨率图像(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问题,我只是想知道它们之间的差异)
Bitmap
一样作为ScaleType.FIT_CENTER
处理。 - mmlooloodecodeRegion
忽略了屏幕的密度。 - Blackbeltoptions.inDensity = getResources().getDisplayMetrics().densityDpi;
如果它被忽略会发生什么?我没有看到与设备密度的任何连接,位图内存大小由配置选项Bitmap.Config.ARGB_8888
决定。 - mmlooloo