想要知道一个Bitmap 占用多大内存 我们只需要调用getByteCount方法就可以了,但是不可能每次都将图片塞到项目中然后把运行看吧,所以我们必须要学会占卜的技能,精准计算它放进来所占内存来考虑是否放它.
我们测试手机华为mate8 分辨率 1080* 1920,densityDpi 480
测试图片720*1280 放置在xhdpi中
首先必须明白下面的尺寸对应关系
屏幕DPI的对应关系
density | 1 | 1.5 | 2 | 3 | 3.5 | 4 |
---|---|---|---|---|---|---|
densityDpi | 160 | 240 | 320 | 480 | 560 | 640 |
资源文件夹DPI中对应关系
Android手机屏幕标准 | 对应图标尺寸标准 | 屏幕密度 | 比例 |
---|---|---|---|
xxxhdpi 3840*2160 | 192*192 | 640 | 16 |
xxhdpi 1920*1080 | 144*144 | 480 | 12 |
xhdpi 1280*720 | 96*96 | 320 | 8 |
hdpi 480*800 | 72*72 | 240 | 6 |
mdpi 480*320 | 48*48 | 160 | 4 |
ldpi 320*240 | 36*36 | 120 | 3 |
https://blog.csdn.net/u010652002/article/details/72676723
源码追踪我们参考上面博客
通道透明ARGB_8888(也就是我们最常用的 Bitmap 的格式)的一个像素占用 4byte,那么 rowBytes 实际上就是 4*width bytes。
屏幕densityDpi(480)
xhdpiDpi (320)
bitmapWidth * densityDpi / xhdpiDpi
bitmapHeight * densityDpi / xhdpiDp
- 4
= 8294400B 差不多7.9M左右
总内存: 8294400
view width: 1080
view height: 1572
bitmap width: 1080
bitmap height:1080
density: 3.0
dpi: 480
scaledWidth = int( 720* 480/ 320f + 0.5) = 1080
scaledHeight = int( 1280* 480 / 320f + 0.5) = 1920