在android中,图片使用上,往往会出现OOM(out of memory)的情况,在这里,我将总结一些办法,来避免OOM的问题。
先看一张图:
这张图里,使用的gridView来显示图片,如果图片数目很多,上下滚动的时候,很容易出现OOM的情况。
这里,每张图片的实际像素是320*480.这里缩放后,每张图片的大小是100*100.、
缩放代码如下:
Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(imagePath, options);
int scale = 1;
while (true) {
if (options.outWidth / 2 >= width && options.outHeight / 2 >= height) {
options.outWidth /= 2;
options.outHeight /= 2;
scale++;
} else {
break;
}
}
Log.i(TAG, "inSampleSize=" + scale);
options.inSampleSize = scale;
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(imagePath, options);
做点说明:
Options这个类,有两个重要的属性。分别是inJustDecodeBounds 和inSampleSize。
inJustDecodeBounds 表示是否只是解码边界信息,也就是,这段代码BitmapFactory.decodeFile(imagePath, options);
之后,options里会存储该图片的高度和宽度信息,而此时返回的bitmap是为null的。
得到了图片的高度和宽度之后,我们再看下一个属性inSampleSize,这个属性可以理解为缩放比例,是int类型,缩放比例为2的指数倍
比如说inSampleSize=1时,则表示不缩放,inSampleSize=2时,表示长和宽都分别缩小到原来的1/2*2,即四分之一,同理为3时则为九分之一。
最后缩放出来的大小,并不是能和要求的大小一模一样,但是不会小于指定的长和宽,可以在LayoutParams里指定长和宽,即达到了图上的效果。