关于dp dip dpi px

时间:2023-03-08 16:00:54

在Android开发中,屏幕适配是一件非常让人头疼的事情。有时候在这个机型上调试的漂漂亮亮的UI界面,换一部手机就丑的不忍直视。但为了我们软件更好的用户体验,我们必须适应Android市场上形形色色的手机。

你像做前端的人,为了给用户最优质的体验,他们也需要适配各种不同分辨率的屏幕啊,但是他们为什么不需要为这个问题发愁呢?恩,这要是因为这个东西-----百分比。他们可以听过设置百分比而不强制设定宽高的形式来适配,这样根据机型不同,他们的显示效果并不会有太大差异。然而,可惜的是,Android中并不支持这种技术,只有dp sp这种单位。那么下来我们就来研究一下这些单位。

dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。

dp: dip是一样的

px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。

sp: scaled pixels(放大像素). 主要用于字体显示best for textsize。

在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;

}

该函数功能:是把各单位换算为像素px。

metrics.density:默认值为DENSITY_DEVICE / (float) DENSITY_DEFAULT;

metrics.scaledDensity:默认值为DENSITY_DEVICE / (float) DENSITY_DEFAULT;

DENSITY_DEVICE:为屏幕密度

DENSITY_DEFAULT:默认值为160

由此得出:dp和px的转换公式如下:

    px = dip * density / 160

    当density (屏幕密度)=160时,px=dp

 

根据 google 的建议,TextView 的字号最好使用 sp 做单位,而且查看TextView的源码可知Android默认使用sp作为字号单位。将dip作为其他元素的单位。