android 手机大概现在分为下面几种dpi, 分别是:
120dpi , 160dpi ,240dpi ,320dpi ,480dpi , 640dpi,
分别对应的项目中资源包为:
ldpi , mdpi , hdpi , xhdpi , xxhdpi , xxxhdpi ;
//======================
计算一个bitmap占用的内存是多大 , 计算方法是这个bitmap在内存中的宽 * 内存中的高 * Config
Config的内存计算 : ARGB_8888 对应8+8+8+8 = 32位 =4个字节 , RGB_565 对应 5+6+5 = 16位 = 2字节;
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap drawableBmp = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher, opt);
Toast.makeText(BitmapDensityActivity.this, opt.outWidth* opt.outHeight*4, Toast.LENGTH_SHORT).show(); //toast 占用内存多少字节
上边的toast的值和bitmap.getRowBytes()方法的返回值是一样的;
//======================
做项目用到的那些资源图片 , 放到不同的包(mipmap-mdpi,hdpi,xxdpi...)下, 对占用的内存和内存中图片的尺寸是有很大影响的;
现在有个原图 , 宽高 : 100 * 100;
先放到 mdpi 的包下 , 如果用 480dpi的手机用BitmapFactory直接加载 ,那么宽高就会改变, 改变计算方式为 :
原图宽高 / 资源包对应的dpi * 手机对应的 dpi ,
也就是这个图如果加载到内存 , 宽高 = 100 / 160 * 480 = 300 ; , 那么内存占用就是 300*300 *4 = 360000 byte = 351kb;
然后在放到与之手机一致的包(xxhdpi)下
内存中图片的宽高 = 100 / 480 * 480 = 100 , 占用内存为 : 100*100*4 = 40000byte = 39kb ; 差了近十倍;
所以资源图片放到越高的dpi包下, 内存占用相对减少 ,但是图片尺寸可能会相对变小 , 现在手机一般都是480dpi的比较多,所以放到xxhdpi下相对好一些;
//=========================
对于加载sd卡中的图片,则内存尺寸和图片尺寸一致 , 除非增大inSampleSize ;
如果放到没有后缀的资源包(比如drawable)下,则按照mdpi来处理