预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共54页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

Android图片加载性能优化总结 一、AndroidBitmap加载大尺寸图片优化: 压缩原因:1.imageview大小如果是200*300那么加载个2000*3000的图片到内存中显然是浪费可耻滴行为;2.最重要的是图片过大时直接加载原图会造成OOM异常(outofmemory内存溢出)所以一般对于大图我们需要进行下压缩处理看不懂英文的话木有关系,本篇会有介绍主要处理思路是:1.获取图片的像素宽高(不加载图片至内存中,所以不会占用资源)2.计算需要压缩的比例3.按将图片用计算出的比例压缩,并加载至内存中使用官网大图片加载教程(上面网址里的)对应代码就是: /** *获取压缩后的图片 *@paramres *@paramresId *@paramreqWidth所需图片压缩尺寸最小宽度 *@paramreqHeight所需图片压缩尺寸最小高度 *@return */ publicstaticBitmapdecodeSampledBitmapFromResource(Resourcesres,intresId,intreqWidth,intreqHeight){ //首先不加载图片,仅获取图片尺寸 finalBitmapFactory.Optionsoptions=newBitmapFactory.Options(); //当inJustDecodeBounds设为true时,不会加载图片仅获取图片尺寸信息 options.inJustDecodeBounds=true; //此时仅会将图片信息会保存至options对象内,decode方法不会返回bitmap对象 BitmapFactory.decodeResource(res,resId,options); //计算压缩比例,如inSampleSize=4时,图片会压缩成原图的1/4 options.inSampleSize=calculateInSampleSize(options,reqWidth,reqHeight); //当inJustDecodeBounds设为false时,BitmapFactory.decode...就会返回图片对象了 options.inJustDecodeBounds=false; //利用计算的比例值获取压缩后的图片对象 returnBitmapFactory.decodeResource(res,resId,options); } 代码详解: 核心方法是BitmapFactory.decode...(....,options) ...的意思是此外还有一系列的decodeFile/decodeStream等等方法,都是利用options灵活解析获取图片, 只不过解析图片的来源不同罢了,比如网络图片获取,一般就是解析字节流信息然后decode获取图片实例 Options是图片配置信息,参数详细介绍下: inJustDecodeBounds是否只解析边界设为true时去decode获取图片,只会加载像素宽高信息设为false时decode则会完全加载图片inSampleSize压缩比例比如原图200*300,如果值是2时会压缩成100*150;是4则图片压缩成50*75最好是2的幂数,比如24816.....outHeight图片原高度outWidth图片原宽度其他参数自行研究,这里暂时只用到这几个decodeSampledBitmapFromResource方法内的三段代码对应上面的三步流程难点在于中间那步,压缩比例的计算,官网同样提供了个calculateInSampleSize方法其中reqWidth和reqHeight是所需图片限定最小宽高值 /** *计算压缩比例值 *@paramoptions解析图片的配置信息 *@paramreqWidth所需图片压缩尺寸最小宽度 *@paramreqHeight所需图片压缩尺寸最小高度 *@return */ publicstaticintcalculateInSampleSize(BitmapFactory.Optionsoptions,intreqWidth,intreqHeight){ //保存图片原宽高值 finalintheight=options.outHeight; finalintwidth=options.outWidth; //初始化压缩比例为1 intinSampleSize=1; //当图片宽高值任何一个大于所需压缩图片宽高值时,进入循环计算系统 if(height>reqHeight||width>reqWidth){ finalinthalfHeight=height/2; finalinthalfWidth=width/2; //压缩比例值每