关于android资源文件图片和SD卡图片加载到内存的占用

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来处理





你可能感兴趣的:(android)