Android 加载大图的缩略图显示
2015-08-06 21:18
246 查看
问题来了
在android中,我们很多界面都会用到图片显示,我们从网络服务器上加载图片到本地,并显示出来,这个操作我想大家都很熟悉吧?
很多新手,比如我自己,之前从来没有考虑过图片大小问题,一般从服务器下载图片,就直接扔进ImageView或者其他的Ui组件中去了,最近在做一个图片列表的时候,经常在一些手机上OOM,所以就花时间研究了一下这个东西
首先我们加载张高清图,如果是一张1080*1080的图片到手机上显示,按照每一个像素4字节的大小,大约计算出图片会占用内存大小约4.5M,一个列加载10张,稍微滑动,估计就直接OOM了,其实显示在界面只有那个图片显示组件的大小,但是我们却加载了整个大图到内存,是不是觉得很浪费资源啊???
解决问题
既然有问题,那么我们就来解决问题:
一张1080的图片,我们显示到界面,估计就在200px到300左右吧,那么怎么计算缩小比例呢
步骤二: 得到了图片缩小的比例,那么我们接下来应该做的事什么呢???肯定是去缩小图片啊**
好了,试试吧,看看是不是缩小了`,虽然这个不能完全解决OOM,但是肯定比完全加载到内存要好的多啊
之后我会更新内存缓存和磁盘缓存的文章,让OOM无所遁形
在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无所遁形
相关文章推荐
- Android 基于蓝牙的方向控制器
- Android如何跳过小米和魅族手机对Toast的限制
- Android Service组件
- Android中visibility属性VISIBLE、INVISIBLE、GONE的区别
- android 当屏幕截图,你如何改变屏幕内容,他们俩bitmap将合并的图像被一起显示
- Android使得手机拍照功能的发展(源共享)
- 由浅入深学习自定义控件(4)-滑动开关slidemenu
- Android复习笔记(14)-自定义控件(1)-滑动开关
- Android DVM
- Android ListView&异步加载的学习(三)——AsyncTask加载图片&运用Lru算法优化图片加载
- Android Studio配置Github
- Android错误总结大全!
- android ScrollView fillViewport属性
- Android Design Support Library使用示例(一)
- Android代码内存优化建议-Java官方篇
- Android代码内存优化建议-Android官方篇
- Android代码内存优化建议-Android资源篇
- android侧滑菜单框架SlidingMenu的使用
- Android 消息推送
- Android学习路线——渐进