px, dp, dip, sp之间的区别
px: pixel,即像素,1px代表屏幕上的一个物理的像素点。但px单位不被建议使用。因为同样像素大小的图片在不同手机显示的实际大小可能不同。要用到px的情况是需要画1像素表格线或阴影线的时候,如果用其他单位画则会显得模糊。
dip (dp): device independent pixel。dp (dip)是最常用也是最难理解的尺寸单位。与像素密度密切相关。Android系统定义了四种像素密度:低(120dpi)、中(160dpi)、高(240dpi)和超高(320dpi),它们对应的dp到px的系数分别为0.75、1、1.5和2,这个系数乘以dp长度就是像素数。例如界面上有一个长度为“80dp”的图片,那么它在240dpi的手机上实际显示为80x1.5=120px,在320dpi的手机上实际显示为80x2=160px。如果你拿这两部手机放在一起对比,会发现这个图片的物理尺寸“差不多”,这就是使用dp作为单位的效果。
sp: Scale-independent Pixel,即与缩放无关的抽象像素。sp和dp很类似但唯一的区别是,Android系统允许用户自定义文字尺寸大小(小、正常、大、超大等等),当文字尺寸是“正常”时,1sp=1dp=0.00625英寸,而当文字尺寸是“大”或“超大”时,1sp>1dp=0.00625英寸。类似我们在windows里调整字体尺寸以后的效果——窗口大小不变,只有文字大小改变。
废话就不多说了,直接说重点。首先解释下这几个单位的代表意思。
由于过去通常以像素为单位设计计算机用户界面。当一个像素在80x80的时候,在高分辨率显示器上运行该程序,则用户界面会显得很小。所以采用与分辨率无关的度量单位来开发程序就能够解决这个问题。而Android应用开发支持不同的度量单位。
一.解释下:
dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持 WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。
dp: dip是一样的
px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。
pt: point,是一个标准的长度单位,1pt=1/72英寸=0.035厘米,用于印刷业,非常简单易用;
sp: scaled pixels(放大像素). 主要用于字体显示best for textsize。
in(英寸):长度单位。 1英寸=2.54厘米(约);
mm(毫米):长度单位。
当然我们光是了解不会用那就不行了。
二.度量单位的换算公式
在android源码包TypedValue.java中,我们看如下函数:
public static float applyDimension(int unit, float value, DisplayMetrics metrics) {
switch (unit) {
case COMPLEX_UNIT_PX:
return value;
case COMPLEX_UNIT_DIP:
return value * metrics.density;
case COMPLEX_UNIT_SP:
return value * metrics.scaledDensity;
case COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f/72);
case COMPLEX_UNIT_IN:
return value * metrics.xdpi;
case COMPLEX_UNIT_MM:
return value * metrics.xdpi * (1.0f/25.4f);
}
return 0;
}
该函数功能:是把各单位换算为像素。
metrics.density:默认值为DENSITY_DEVICE / (float) DENSITY_DEFAULT;
metrics.scaledDensity:默认值为DENSITY_DEVICE / (float) DENSITY_DEFAULT;
metrics.xdpi:默认值为DENSITY_DEVICE;
DENSITY_DEVICE:为屏幕密度
DENSITY_DEFAULT:默认值为160
然后我们还得了解Android有哪些屏:如下表
屏幕 Tyep | 宽度 Pixels | 高度 Pixels | 尺寸 Range(inches) | 屏幕密度 |
QVGA | 240 | 320 | 2.6-3.0 | low |
WQVGA | 240 | 400 | 3.2-3.5 | low |
FWQVGA | 240 | 432 | 3.5-3.8 | low |
HVGA | 320 | 480 | 3.0-3.5 | Medium |
WVGA | 480 | 800 | 3.3-4.0 | High |
FWVGA | 480 | 854 | 3.5-4.0 | High |
WVGA | 480 | 800 | 4.8-5.5 | Medium |
FWVGA | 480 | 854 | 5.0-5.8 | Medium |
备注 | 目前android默认的low=120 ;Medium =160; High = 240 |
px和dip的区别:
px就是像素的意思:1px代表屏幕上一个物理的像素点;所以用像素相当于实际像素画。那么100px的图片不同的手机上就会出现大小不一样。就向100长度的线在200屏幕宽上显示的就是一半,而在300屏幕上就只占用了1/3。
dip与dp完全相同,只是名字不同而已。在早期的Android版本里多使用dip,后来为了与sp统一就建议使用dp这个名字了。这里就细细解释下dp:它与“像素密度”密切相关,所以首先我们解释一下什么是像素密度?
像素密度:假设手机屏幕分辨率为240x320,屏幕的物理尺寸为1.5英寸x2英寸,(1英寸(in)=2.54厘米(cm)),那么每英寸包含的像素点的数量为240/1.5=160dpi(宽)或320/2=160dpi(高),160dpi就是这部手机的像素密度。
刚才表中已经说明了Android手机分(low=120 ;Medium =160; High = 240,VeryHigh=320)低,中,高,超高四等密度,而他们对应的dp到px的系数分别为0.75、1、1.5和2,这个系数乘以dp长度就是像素数。
最后:在大小屏幕相同,分辨率不一样时候(480x320分辨率或者800x480),假设一个80dp长度的图片,换算成240dpi的手机上实际显示为80x1.5=120px,在320dpi的手机上实际显示为80x2=160px,这样使用dp就感觉差别不是很大了。
sp:
与缩放无关的抽象像素(Scale-independent Pixel)。sp和dp很类似但唯一的区别是,Android系统允许用户自定义文字尺寸大小(小、正常、大、超大等等),当文字尺寸是“正常”时1sp=1dp=0.00625英寸,而当文字尺寸是“大”或“超大”时,1sp>1dp=0.00625英寸。类似我们在windows里调整字体尺寸以后的效果——窗口大小不变,只有文字大小改变。
使用建议,文字的尺寸一律用sp单位,非文字的尺寸一律使用dp单位。例如textSize="16sp"、layout_width="60dp";偶尔需要使用px单位,例如需要在屏幕上画一条细的分隔线时: