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) |
-
ppi (pixels per inch)图像分辨率 (在图像中,每英寸所包含的像素数目)
-
dpi (dots per inch)打印分辨率 (每英寸所能打印的点数,即打印精度)dpi主要应用于输出,重点是打印设备上。我们在移动应用中提到ppi和dpi其实都一样(概念不同,但对设计来讲没有特别需要深入了解)。
-
dp:(Density-independent Pixels)密度独立像素,基于屏幕物理密度的一个抽象单位。 这个单位以160dpi(dots per inch)的屏幕为标准,在这个屏幕上1dp=1px。dp和px的换算公式:
dp*dpi/160 = px (如:1dp x 320dpi/160 = 2px)
这个是最常用也是最难理解的尺寸单位。它与“像素密度”密切相关,所以首先我们解释一下什么是像素密度。假设有一部手机,屏幕的物理尺寸为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作为单位的效果
-
sp (Scale-independent Pixels)比例独立像素 这是与dp很像的一个单位,但受用户的字体大小设置影响进行缩放。推荐用于设置字体大小,这样就能同时适配屏幕密度和用户字体偏好。以160DPI屏幕为标准,当字体大小为 100%时, 1sp=1px。
sp 与 px 的换算公式:sp*dpi/160 = px
-
px (pixels)像素, 对应屏幕上的实际像素。这个单位不推荐使用,因为在实际使用中会根据设备而变化。每台设备在每英寸的px数不同,并且屏幕上的有效px数也不同。
-
pt(Points)磅, 是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用; 在 Android 中,1pt 大概等于 2.22sp。
-
mm (Millimeters)毫米, 长度单位。
-
in (Inches)英寸, 长度单位。1英寸=2.54厘米。
二、应用
根据google的推荐,像素统一使用dip,字体统一使用sp。
在android里面,获取一个窗口的metrics,里面有这么几个值
metrics.density;
metrics.densityDpi;
metrics.scaledDensity;
metrics.xdpi;
metrics.ydpi;
- densityDpi:就是我们常说的dpi。
- density:是DPI/(160像素/英寸)后得到的比例值。
- scaledDensity:字体缩放比。
- xdpi:即水平方向每英寸中的像素数。
- 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
- Android Design [1] 里把主流设备的 dpi 归成了四个档次,120 dpi、160 dpi、240 dpi、320 dpi
实际开发当中,我们经常需要对这几个尺寸进行相互转换(比如先在某个分辨率下完成设计,然后缩放到其他尺寸微调后输出),一般按照 dpi 之间的比例即 2:1.5:1:0.75 来给界面中的元素来进行尺寸定义。
也就是说如果以 160 dpi 作为基准的话,只要尺寸的 DP 是 4 公倍数,XHD的PI 下乘以 2,HDPI 下乘以 1.5,LDPI 下乘以 0.75 即可满足所有尺寸下都是整数 pixel 。
但假设以 240 dpi 作为标准,那需要 DP 是 3 的公倍数,XHDPI 下乘以 1.333,MDPI 下乘以 0.666 ,LDPI 下除以 2 而以 LDPI 和 XHDPI 为基准就更复杂了,所以选择 160 dpi - 这个在Google的官方文档中有给出了解释,因为第一款Android设备(HTC的T-Mobile G1)是属于160dpi的。
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/