- ppi
pixel per inch,每英寸像素数,针对显示器的设计时,dpi=ppi。ppi计算方法是长宽各自平方之和开方,除以对角线长度(单位英寸)。
- dpi
dot per inch,每英寸多少点,是由ppi确定的。实际上dpi有:
-
- low:120
- medium:160
- hdpi:240
- xhdpi:260, 280, 300, 320
- xxhdpi:340, 360, 400, 420, 480
- xxxhdpi: 560, 640
我们可以通过getResources().getDisplayMetrics().densityDpi
获取手机实际的dpi。
可以更改手机的dip:
-
- 需要root手机
- 更改/system/build.prop中的ro.sf.lcd_density属性,这个值越小,屏幕的密度越高
- adb reboot重启手机
快速查看手机屏幕信息:
adb shell dumpsys display | findstr DisplayDeviceInfo
- dp或dip
是android开发用的单位,1dp表示在屏幕点密度为160ppi时1px长度;因为android设备屏幕众多,不可能为每个屏幕单独开发,所以用公式 px=dp*(ppi/160) 来计算在不同屏幕上的像素数。
举例:
HVGA屏320*480,一般是3.5寸屏,计算点密度为: √(320^2 + 480^2) / 3.5 = 164,约等于160,1dp=1px;
WVGA屏480*800,按3.8寸屏,点密度:√(320^2 + 480^2) / 3.5 = 245,约等于240,1dp=1.5px;
- px
像素(pixel),屏幕上的物理点,最小的独立显示单位。
- 与图片内存的关系
如果将180*180的图片放hdpi目录中,那实际显示的图片大小应该为 180 * (560/240) + 0.5f = 420px,图片的大小应该为420px,同理:
放入xhdpi目录中,实际大小应该为 180 * (560/320) + 0.5f = 315px
放入xxhdpi目录中,实际大小应该为 180 * (560/480) + 0.5f = 210px
现在我们知道一张图片放置在不同的资源目录中,系统decode的bitmap的size大小是如何计算了。那一张图片大概占多少内存?其实只用看一个像素占用多少内存就可以吗?
我们知道屏幕上的颜色是有R,G,B加透明度表示的,Android官方支持的rgb格式,主要是: alpha_8, rgb_565, argb_4444, argb_8888这几种。
以argb_8888为例,表示一个像素点,使用8位表示透明度,8位表示Red, 8位表示Green, 8位表示Blue,加起来,一个像素就需要4byte,同理,rgb_565一个像素需要2byte。
Android decode资源图片时默认会选择argb_8888,我们知道将180*180放入hdpi目录中,那实际大小应该为420px,那像素内存大小为 420 * 420 * 4 = 705600byte = 689kb。同理:
放入xhdpi目录中,实际大小应该为 180 * (560/320) + 0.5f = 315px,那像素内存大小为 315 * 315 * 4 = 396900byte = 387.6kb;
放入xxhdpi目录中,实际大小应该为 180 * (560/480) + 0.5f = 210px,那像素内存大小为 210 * 210 * 4 = 176400byte = 172.2kb;