我经常被这几个搞混淆😂,故今天我专门去弄清楚它和记录它,方便自己更进一步学习Android的屏幕适配
一.基本概念
- dpi:dots per inch , 说白了就是一英寸有多少个像素点。常见取值 120,160,240。我一般称作像素密度,简称密度
- dip:Density independent pixels ,设备独立像素 — 这个和设备硬件有关,一般我们为了支持手机上多种分辨率,如WVGA、HVGA和QVGA,都会使用dip作为长度的单位
- dp:与dip完全相同,只是名字不同而已。在早期的Android版本里多使用dip,后来为了与sp统一就建议使用dp这个名字了。
- px:屏幕的像素点,简称像素
- sp:与缩放无关的抽象像素(Scale-independent Pixel)。sp和dp很类似但唯一的区别是,Android系统允许用户自定义文字尺寸大小(小、正常、大、超大等等),当文字尺寸是“正常”时1sp=1dp=0.00625英寸,而当文字尺寸是“大”或“超大”时,1sp>1dp=0.00625英寸。类似我们在windows里调整字体尺寸以后的效果——窗口大小不变,只有文字大小改变。(建议使用sp作为文本的单位,其它用dp)
- density:直接翻译的话貌似叫 密度。常见取值 1.5 , 1.0 。和标准dpi的比例(160px/inc)
- ** 分辨率 **:横纵两个方向像素点的数量,例如480x800,1920x1080
- ** 屏幕尺寸 **:我们生活中经常听到手机5英寸,4.5英寸。电脑23.8英寸。它的结果是按照屏幕的对角线计算出来的,1英寸=2.5400 厘米,也就是说,5英寸=12.7厘米
- 屏幕比例的问题:因为只确定了对角线长,2边长度还不一定。所以有了4:3、16:9这种,这样就可以算出屏幕边长了。
二.应用
- 在Android里面,获取一个窗口的metrics,里面有这么几个值
metrics.density;
metrics.densityDpi;
- densityDpi:就是像素密度(dpi)
- density: 其实是 DPI / (160像素/英寸) 后得到的值。从基本概念就看得出了,DPI本身的单位也是 像素/英寸,所以density其实是没单位的,它就是一个比例值。而dpi的单位是 像素/英寸,比较符合物理上面的密度定义,密度不都是单位度量的值么,为了防止混淆,dpi叫像素密度,简称密度,density就叫density。(注:density值表示每英寸有多少个显示点,与分辨率是两个概念)
三.单位互相转换
-
1.计算dpi
例如有一台手机,屏幕4寸,分辨率480X800,它的dpi如何算呢?
因为不知道边长,肯定不能分开算,4是对角线长度,那直接用勾股定理算对角线像素,除以4,算出来大概是 dpi = 233 像素/英寸。
那么density就是 (233 px/inch)/(160 px/inch)=1.46 左右
顺便说下,android默认的只有3个dpi,low、medium和high,对应 120、160、240,如果没有特别设置,所有的dpi都会被算成这3个,其中default的为160. -
2. 计算 dp 与 px
我们写布局的时候,肯定还是要知道1个dp到底有多少px的。
换算公式如下: dp = (DPI/(160像素/英寸))px = density px
注意,这里都是带单位的。px是单位,dp是单位,density没单位。
为了方便,假设dpi是240 像素/英寸 , 那么density就是1.5
那么就是 dp=1.5px ,注意这是带了单位的,也就是 设备无关像素 = density 像素
那么转换为数值计算的话,应该是下面这个式子
PX = density * DP
** 也就是:像素值 = density * 设备无关像素值 ,�请注意这里有个值字 **
-
3. 为啥 标准dpi = 160
(1)Android Design [1] 里把主流设备的 dpi 归成了四个档次,120 dpi、160 dpi、240 dpi、320 dpi
实际开发当中,我们经常需要对这几个尺寸进行相互转换(比如先在某个分辨率下完成设计,然后缩放到其他尺寸微调后输出),一般按照 dpi 之间的比例即 2:1.5:1:0.75 来给界面中的元素来进行尺寸定义。
也就是说如果以 160 dpi 作为基准的话,只要尺寸的 DP 是 4 的公倍数,XHDPI 下乘以 2,HDPI 下乘以 1.5,LDPI 下乘以 0.75 即可满足所有尺寸下都是整数 pixel 。
但假设以 240 dpi 作为标准,那需要 DP 是 3 的公倍数,XHDPI 下乘以 1.333,MDPI 下乘以 0.666 ,LDPI 下除以 2
而以 LDPI 和 XHDPI 为基准就更复杂了,所以选择 160 dpi
(2)这个在Google的官方文档中有给出了解释,因为第一款Android设备(HTC的T-Mobile G1)是属于160dpi的。