dip:
device independent pixels (设备独立像素)。不同设备不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。
dp:
density independent pixels(与密度无关的像素),它与像素密度有关。像素密度的单位dpi是Dots Per Inch的缩写,即每英寸像素数量。
不同的手机/平板可能具有不同的像素密度,例如同为4寸手机,有480×320分辨率的也有800×480分辨率的,前者的像素密度就比较低。Android系统定义了四种像素密度:ldpi(120dpi)、mdpi(160dpi)、hdpi(240dpi)和xhdpi(320dpi),它们对应的dp到px的系数分别为0.75、1、1.5和2,这个系数乘以dp长度就是像素数。例如界面上有一个长度为“100dp”的图片,那么它在240dpi的手机上实际显示为80×1.5=120px,在320dpi的手机上实际显示为80×2=160px。如果你拿这两部手机放在一起对比,会发现这个图片的物理尺寸“差不多”,这就是使用dp作为单位的效果。
dpi:
dots per inch(每英寸像素数量),dpi = √(长度像素数的 平方+ 宽度像素数的平方) / 屏幕对角线英寸数。
px
pixels(像素), 屏幕上的点,不同设备不同的显示屏显示效果相同,这是绝对像素,是多少就永远是多少不会改变。一般我们HVGA代表320×480像素,这个用的比较多。
sp
scale independent pixels, 主要处理字体的大小。以160dpi屏幕为标准,当字体大小为 100%时, 1sp=1px。
dip与px转换的方法:
public static int dip2px(Context context, float dipValue){
final float scale = context.getResources().getDisplayMetrics().density; //density表示dp到px的系数,例如320dpi的屏幕时,density为1.
return (int)(dipValue * scale + 0.5f);
}
public static int px2dip(Context context, float pxValue){
final float scale = context.getResources().getDisplayMetrics().density;
return (int)(pxValue / scale + 0.5f);
}