Android程序优化,通常是指性能和内存的优化,更快的响应速度,更低的内存占用。
大尺寸的图片在进行显示的时候都会需要性能和内存的优化。
如果直接调用setImageResource(resId)的话,运行的时候会调用BitmapFactory.decodeStream()方法将资源图片生成一个Bitmap, 然后由这个Bitmap生成一个Drawable,最后再将这个Drawable设置到ImageView。
因为生成了Bitmap,如果图片过大,就会导致性能和内存占用问题。
这个时候需要根据目标尺寸重新生成Bitmap然后将生成后的Bitmap设置到ImageView上, 具体的方法:
1, 将BitmapFactory.Options的InJustDecodeBounds设置true
2,调用BitmapFactory.decodeResource(getResources(), resId, options)不会在内存中生成Bitmap,而只是得到原始图片的属性(width,height,type and etc)
3, 根据目标尺寸重新计算options.inSampleSize,这个值的意思图片的宽高按比例缩小。比如一张图片的大小是2000×1000,如果inSampleSize=2,那么缩小后的图片大小是1000×500,即为原来的1/4.
4, 将BitmapFactory.Options的InJustDecodeBounds重新设回false,保证再次调用BitmapFactory.decodeResource(getResources(), resId, options)会生成Bitmap对象。
5,调用ImageVIew对象的setImageBitmap(bitmap)方法,将生成后的Bitmap对象设置到ImageView。
Bitmap占用的内存为:像素总数×每个像素占用的内存。四种像素类型:ARGB_8888,ARGB_4444,ARGB_565,ALPHA_8,每个像素占用的字节数是4,2,2,1.因此一个2000×1000的ARGB_8888类型的Bitmap占用的内存大约为:2000×1000×4=7.63M。
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 |