(个人笔记,如有错误,欢迎指正)
相关概念
DPI(Dots Per Inch)
像素线密度,亦即屏幕上每英寸的长度中有多少像素。此参数由分辨率与屏幕尺寸共同决定,但是系统中预定义的dpi却不一定与实际的物理dpi完全相同。
DP(Device Independent Pixel)
设备独立像素,一种虚拟的像素单位,本质上是物理长度,亦即160dpi的设备上一个像素的物理长度,大约是160微米。
屏幕适配问题
在具体的编程开发中,我们所采用的各种长度都是以像素为单位的,而非实际的物理长度。
但是,由于各种屏幕的像素密度不同,所以相同的像素长度,在不同的屏幕下,很有可能会有不同的物理长度。例如同样的160像素,在160dpi的屏幕上是2.54厘米,而在320dpi的屏幕上却是5.08厘米。
因此,像素无法用来去表示绝对长度,我们就需要一种设备无关的单位去描述绝对长度,所以就采用实际的物理长度,也就是dp
换算关系
ldpi | mdpi | hdpi | xhdpi | xxhdpi | xxxhdpi | |
---|---|---|---|---|---|---|
分辨率 | 240x320 | 320x480 | 480x800 | 720x1280 | 1080x1920 | 1440x2560 |
系统dpi | 120 | 160 | 240 | 320 | 480 | 640 |
基准比例 | 0.75 | 1 | 1.5 | 2 | 3 | 4 |
不同分辨率下dpi等级大小以及相关比例 |
---|
px作为屏幕与屏幕之间,在保持实际物理长度不变的情况下,进行像素长度转换的桥梁,所有的px都必须先转换为dp,才能进行后续的换算。
- 例如一个 160 px × 160 px 大小的图片,其大小相当于 1 dp × 1 dp
- 若显示到 xhdpi 下的屏幕,则将其乘以相应的 dpi 大小,变为 320 px × 320 px,对照上表,其缩放的比例刚好为 2 倍;
- 若显示到 hdpi 下的屏幕,则将其乘以相应的 dpi 大小,变为 240 px × 240 px,对照商标,其缩放比例刚好为 1.5 倍。
图片适配问题
在Android Studio的图片资源文件夹里,我们往往会发现有好几个文件夹存储着内容一模一样的图片文件,而文件夹名字的后缀一般就是上述的DPI等级,例如drawable-hdpi、drawable-mdpi 和 drawable-xhdpi 等等。
如前所述,特定像素大小的图片,在不同DPI的屏幕上,往往会存在放缩的现象,如此则必然会造成图片质量的损失。因此,我们就需要为不同DPI的屏幕分别设计对应像素大小的图片,以保证图片的质量。
除此之外,以下有一张附表,来自 http://petrnohejl.github.io/Android-Cheatsheet-For-Graphic-Designers/ 说明的是不同屏幕的像素密度与对应图标大小的关系:
Qualifier | DPI | Scaling factor | Launcher icon | Action bar, tab icon | Notification icon (API 11) |
---|---|---|---|---|---|
ldpi | 120 | 0.75 | 36 x 36 | 24 x 24 | 18 x 18 |
mdpi | 160 | 1.0 | 48 x 48 | 32 x 32 | 24 x 24 |
hdpi | 240 | 1.5 | 72 x 72 | 48 x 48 | 36 x 36 |
xhdpi | 320 | 2.0 | 96 x 96 | 64 x 64 | 48 x 48 |
xxhdpi | 480 | 3.0 | 144 x 144 | 96 x 96 | 72 x 72 |