网站开发属于软件开发行业吗,西安百度推广运营公司,上海seo网络推广公司,集团门户网站建设费用转自#xff1a;http://my.oschina.net/rengwuxian/blog/182885 高效使用Bitmaps有什么好处#xff1f; 我 们常常提到的“Android程序优化”#xff0c;通常指的是性能和内存的优化#xff0c;即#xff1a;更快的响应速度#xff0c;更低的内存占用。Android程序的性能…转自http://my.oschina.net/rengwuxian/blog/182885 高效使用Bitmaps有什么好处 我 们常常提到的“Android程序优化”通常指的是性能和内存的优化即更快的响应速度更低的内存占用。Android程序的性能和内存问题大部 分都和图片紧密相关而图片的加载在很多情况下很用到Bitmap位图这个类。而由于Bitmap自身的特性将每个像素的属性全部保存在内存中 导致稍有不慎就会创建出一个占用内存非常大的Bitmap对象从而导致加载过慢还会有内存溢出的风险。所以Android程序要做优 化Bitmap的优化是必不可少的一步。 需要对Bitmap进行优化的情形 首先请看一行代码 1mImageView.setImageResource(R.drawable.my_image); 这是一行从资源文件中加载图片到ImageView的代码。通常这段代码没什么问 题但有些情况下你需要对这段代码进行优化。例如当图片的尺寸远远大于ImageView的尺寸时或者当你要在一个ListView或 GridView中批量加载一些大小未知的图片时。实际上以上这行代码会在运行时使用BitmapFactory.decodeStream()方法将 资源图片生成一个Bitmap然后由这个Bitmap生成一个Drawable最后再将这个Drawable设置到ImageView。由于在过程中 生成了Bitmap因此如果你使用的图片过大就会导致性能和内存占用的问题。另外需要优化的情形不止这一种这里就不再列举。 下面分步说明使用代码来减小Bitmap的尺寸从而达到减小内存占用的方法 1. 获取原图片尺寸 通常我们使用BitmapFactory.decodeResource()方法来从资源文件中读取一张 图片并生成一个Bitmap。但如果使用一个BitmapFactory.Options对象并把该对象的inJustDecodeBounds属性设 置为truedecodeResource()方法就不会生成Bitmap对象而仅仅是读取该图片的尺寸和类型信息 1BitmapFactory.Options options new BitmapFactory.Options(); 2options.inJustDecodeBounds true; 3BitmapFactory.decodeResource(getResources(), R.id.myimage, options); 4int imageHeight options.outHeight; 5int imageWidth options.outWidth; 6String imageType options.outMimeType; 2. 根据原图尺寸和目标区域的尺寸计算出合适的Bitmap尺寸 BitmapFactory.Options类有一个参数 inSampleSize该参数为int型他的值指示了在解析图片为Bitmap时在长宽两个方向上像素缩小的倍数。inSampleSize的默认 值和最小值为1当小于1时解码器将该值当做1来处理且在大于1时该值只能为2的幂当不为2的幂时解码器会取与该值最接近的2的幂。例如 当inSampleSize为2时一个2000*1000的图片将被缩小为1000*500相应地它的像素数和内存占用都被缩小为了原来的 1/4 01public static int calculateInSampleSize( 02 BitmapFactory.Options options, int reqWidth, int reqHeight) { 03 // 原始图片的宽高 04 final int height options.outHeight; 05 final int width options.outWidth; 06 int inSampleSize 1; 07 08 if (height reqHeight || width reqWidth) { 09 10 final int halfHeight height / 2; 11 final int halfWidth width / 2; 12 13 // 在保证解析出的bitmap宽高分别大于目标尺寸宽高的前提下取可能的inSampleSize的最大值 14 while ((halfHeight / inSampleSize) reqHeight 15 (halfWidth / inSampleSize) reqWidth) { 16 inSampleSize * 2; 17 } 18 } 19 20 return inSampleSize; 21} 3. 根据计算出的inSampleSize生成Bitmap 01public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, 02 int reqWidth, int reqHeight) { 03 04 // 首先设置 inJustDecodeBoundstrue 来获取图片尺寸 05 final BitmapFactory.Options options new BitmapFactory.Options(); 06 options.inJustDecodeBounds true; 07 BitmapFactory.decodeResource(res, resId, options); 08 09 // 计算 inSampleSize 的值 10 options.inSampleSize calculateInSampleSize(options, reqWidth, reqHeight); 11 12 // 根据计算出的 inSampleSize 来解码图片生成Bitmap 13 options.inJustDecodeBounds false; 14 return BitmapFactory.decodeResource(res, resId, options); 15} 这里有一点要注意就是要在第二遍decode之前把inJustDecodeBounds设置回false。 4. 调用以上的decodeSampledBitmapFromResource方法使用自定尺寸的Bitmap。 如果你要将一张大图设置为一个100*100的缩略图执行以下代码 1mImageView.setImageBitmap(decodeSampledBitmapFromResource(getResources(), R.id.myimage, 100, 100)); 到此使用decodeResource()方法将一个大图解析为小尺寸bitmap的应用就完成了。同理还可以使用decodeStream()decodeFile()等方法做相同的事原理是一样的。 延伸一个Bitmap到底占用多大内存系统给每个应用程序分配多大内存 · Bitmap占用的内存为像素总数 * 每个像素占用的内存。在Android中Bitmap有四种像素类型ARGB_8888、ARGB_4444、ARGB_565、ALPHA_8他 们每个像素占用的字节数分别为4、2、2、1。因此一个2000*1000的ARGB_8888类型的Bitmap占用的内存为 2000*1000*48000000B8MB。 · Android根据设备屏幕尺寸和dpi的不同给系统分配的单应用程序内存大小也不同具体如下表表格取自Android 4.4 Compatibility Definition Document (CDD) 屏幕尺寸 DPI 应用内存 small / normal / large ldpi / mdpi 16MB small / normal / large tvdpi / hdpi 32MB small / normal / large xhdpi 64MB small / normal / large 400dpi 96MB small / normal / large xxhdpi 128MB xlarge mdpi 32MB xlarge tvdpi / hdpi 64MB xlarge xhdpi 128MB xlarge 400dpi 192MB xlarge xxhdpi 256MB