px dp sp含义

一、基本概念

术语 说明 备注  
Screen size(屏幕尺寸) 是按照屏幕对角线的尺寸来决定的,指的是手机实际的物理尺寸,如:2.8英寸,3.7英寸,4.3英寸 mi2手机是4.3英寸  
Aspect Ratio(宽高比) 值得是实际的物理尺寸宽高比率,分为long和nolong mi2是16:9,属long  
Resolution(分辨率) 和电脑的分辨率概念一样,指手机屏幕纵、横方向像素个数 mi2是1280x720  
PPI (pixels per inch) 图像分辨率 (在图像中,每英寸所包含的像素数目) 实际移动应用中,dpi和ppi一样的。  
DPI(dots per inch) 打印分辨率 (每英寸所能打印的点数,即打印精度) 如:120dpi,160dpi,240dpi等,如mi2:分辨率为1280x720,屏幕尺寸为4.3英寸,dpi=342 实际移动应用中,dpi和ppi一样的。所谓的屏幕密度指的就是这个  
Density(密度) 屏幕里像素值浓度,resolution/Screen size,可以反映出手机密度    
Density-independent Pixels(dip) 指的是逻辑密度计算单位,dip和具体像素值的对应公式是dip/pixel=dpi值/160,也就是px=dpx(dpi/160)    

这个是最常用也是最难理解的尺寸单位。它与“像素密度”密切相关,所以首先我们解释一下什么是像素密度。假设有一部手机,屏幕的物理尺寸为1.5英寸x2英寸,屏幕分辨率为240x320,则我们可以计算出在这部手机的屏幕上,每英寸包含的像素点的数量为xdpi=240/1.5=160dpi(横向)或ydpi=320/2=160dpi(纵向),而手机的像素密度计算公式为:

DPI = √(长度像素数² + 宽度像素数²) / 屏幕对角线英寸数

所以这部手机的DPI=√(320² + 240²) / √(2² + 1.5²)= 160就是这部手机的像素密度,像素密度的单位是Dots Per Inch的缩写,即每英寸像素数量。横向和纵向的这个值都是相同的,原因是大部分手机屏幕使用正方形的像素点。
不同的手机/平板可能具有不同的像素密度,例如同为4寸手机,有480×320分辨率的也有800×480分辨率的,前者的像素密度就比较低。Android系统定义了四种像素密度:低(120dpi)、中(160dpi)、高(240dpi)和超高(320dpi),它们对应的dp到px的系数分别为0.75、1、1.5和2,这个系数乘以dp长度就是像素数。例如界面上有一个长度为“100dp”的图片,那么它在240dpi的手机上实际显示为80×1.5=120px,在320dpi的手机上实际显示为80×2=160px。如果你拿这两部手机放在一起对比,会发现这个图片的物理尺寸“差不多”,这就是使用dp作为单位的效果

二、应用

根据google的推荐,像素统一使用dip,字体统一使用sp。

在android里面,获取一个窗口的metrics,里面有这么几个值

metrics.density;
metrics.densityDpi;
metrics.scaledDensity;
metrics.xdpi;
metrics.ydpi;

三、各单位间转换

1.计算dpi
如一个机器mi2,屏幕尺寸4.3英寸,分辨率1280x720。

DPI = √(长度像素数² + 宽度像素数²) / 屏幕对角线英寸数

DPI=sqrt(1280² + 720²)/4.3=342像素/英寸。
那么density就是(342px/inch)/(160px/inch)=2.14

2.计算dp与px
dp转px:

1dp = (DPI/(160像素/英寸))px = density px

PX = density x DP;
像素值 = density x 设备无关像素值。

3.计算sp与px
sp转px:

sp*dpi/160 = px

但sp还受用户的字体大小设置影响进行缩放。

4.Android系统定义的dpi
实际dpi(公式计算出来的结果)和Android系统dpi 假如分辨率1080×1920,那么5英寸计算出来的是440,4.5英寸dpi是490。如此看来,屏幕密度将会出现很多数值,呈现严重的碎片化。而密度又是安卓屏幕将界面进行缩放显示的依据,那么安卓是如何适配这么多屏幕的呢?
其实,每部安卓手机屏幕都有一个初始的固定dpi值,这些数值是120、160、240、320、480,可以看作为“系统密度”。安卓对界面元素进行缩放的比例依据正是系统定义的dpi值,而不是实际计算出来的dpi。 系统定义dpi图解

密度 ldpi mdpi hdpi xhdpi xxhdpi
代表分辨率 240x320 320x480 480x800 720x1280 1080x1920
密度值(dpi) 120 160 240 320 480
比例 3 4 6 8 12
mdpi基准比例 0.75 1 1.5 2 3

Android系统dpi关系表格,以mdpi(160)为基准

5.为啥 标准dpi = 160

Alt text

Density Bucket Screen Density Physical Size Pixel Size
ldpi 120 dpi 0.5 x 0.5 in 0.5 in * 120 dpi = 60x60 px
mdpi 160 dpi 0.5 x 0.5 in 0.5 in * 160 dpi = 80x80 px
hdpi 240 dpi 0.5 x 0.5 in 0.5 in * 240 dpi = 120x120 px
xhdpi 320 dpi 0.5 x 0.5 in 0.5 in * 320 dpi = 160x160 px
xxhdpi 480 dpi 0.5 x 0.5 in 0.5 in * 480 dpi = 240x240 px
xxxhdpi 640 dpi 0.5 x 0.5 in 0.5 in * 640 dpi = 320x320 px
Unit Description Units Per Physical Inch Density Independent Same Physical Size On Every Screen
px Pixels Varies No No
in Inches 1 Yes Yes
mm Millimeters 25.4 Yes Yes
pt Points 72 Yes Yes
dp Density ~160 Yes No
  Independent      
  Pixels      
sp Scale ~160 Yes No
  Independent      
  Pixels      

参考资料:

http://developer.android.com/guide/topics/resources/more-resources.html#Dimension
http://www.cnblogs.com/yaozhongxiao/p/3842908.html
http://zhuanlan.zhihu.com/zhezhexiong/19565895
http://www.imyukin.com/?p=277
http://colobu.com/2015/03/10/android-dimension-units/ http://azenhuang.github.io/2015/07/27/%E8%AF%A6%E8%A7%A3Android%E5%BC%80%E5%8F%91%E4%B8%ADdp%20dip%20sp%20px%20dpi%20ppi%20%E5%8C%BA%E5%88%AB%E5%92%8C%E8%BD%AC%E6%8D%A2/

Table of Contents