您的位置:首页 > 移动开发 > Android开发

Android 加载大图的缩略图显示

2015-08-06 21:18 246 查看
问题来了

在android中,我们很多界面都会用到图片显示,我们从网络服务器上加载图片到本地,并显示出来,这个操作我想大家都很熟悉吧?

很多新手,比如我自己,之前从来没有考虑过图片大小问题,一般从服务器下载图片,就直接扔进ImageView或者其他的Ui组件中去了,最近在做一个图片列表的时候,经常在一些手机上OOM,所以就花时间研究了一下这个东西

首先我们加载张高清图,如果是一张1080*1080的图片到手机上显示,按照每一个像素4字节的大小,大约计算出图片会占用内存大小约4.5M,一个列加载10张,稍微滑动,估计就直接OOM了,其实显示在界面只有那个图片显示组件的大小,但是我们却加载了整个大图到内存,是不是觉得很浪费资源啊???

解决问题

既然有问题,那么我们就来解决问题:

一张1080的图片,我们显示到界面,估计就在200px到300左右吧,那么怎么计算缩小比例呢

/**
* 获取位图的缩放比例
*
* @param options 传入一个Options对象
* @param width 目标宽度
* @param height 目标高度
* @return 缩小的比例
*/
public int SumSimple(BitmapFactory.Options options, int width, int height) {
int w = options.outWidth;
int h = options.outHeight;
//假设缩放比例为1
int inSimple = 1;
//如果要显示的图的宽或者高,大于你传入的比例
if (width < w || height < h) {
//如果Options里面的图的宽度大于高度(这是为了防止图片缩放造成图片变形)
if (w > h) {
inSimple = Math.round(w / width);
} else {
inSimple = Math.round(h / height);
}

}
return inSimple;
}


步骤二: 得到了图片缩小的比例,那么我们接下来应该做的事什么呢???肯定是去缩小图片啊**

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;  //获得图片的各项属性,不加载图片到内存
BitmapFactory.decodeResource(getResources(), R.drawable.image1, options);  //获取图片
options.inSampleSize = SumSimple(options,100,100);  //获得缩小比例 (传入自定义的宽高)
options.inJustDecodeBounds = false; //inJustDecodeBounds = false的时候,图片会加载到内存中
mImageView.setImageBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.image1,options)); //显示缩小的图片到界面上


好了,试试吧,看看是不是缩小了`,虽然这个不能完全解决OOM,但是肯定比完全加载到内存要好的多啊

之后我会更新内存缓存和磁盘缓存的文章,让OOM无所遁形
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: