参考链接:http://greatverve.cnblogs.com/archive/2011/12/27/Android-dip-dp-sp-pt-px.html
http://ask.zol.com.cn/q/235769.html
px: pixel 像素,屏幕中可显示的最小单元。
pt: point 磅数 1磅等于 1/72英寸 ,一般pt都会作为字体的单位来使用(印刷行业使用)
dpi: density per inch 每英寸像素密度
dp: 也称作 dip density independent pixel 密度无关像素,它在不同像素密度的屏幕中的显示比例保持一致
sp: scaled pixels 是可伸缩像素的意思
dp,sp是可以根据手机的不同进行适配的。
具体如何适配 请看代码
代码来自http://greatverve.cnblogs.com/archive/2011/12/27/Android-dip-dp-sp-pt-px.html
度量单位的换算公式
在android源码包TypedValue.java中,我们看如下函数:
public static float applyDimension(int unit, float value, DisplayMetrics metrics)
{
switch (unit) {
case COMPLEX_UNIT_PX:
return value;
//如果要使用px则直接返回
case COMPLEX_UNIT_DIP:
return value * metrics.density;
//如果要使用dip,也就是dp 则进行换算
// metrics.density:默认值为DENSITY_DEVICE / (float) DENSITY_DEFAULT;
// DENSITY_DEFAULT 为 160
case COMPLEX_UNIT_SP:
return value * metrics.scaledDensity;
//如果要使用sp 则进行换算
// metrics.scaledDensity:默认值为DENSITY_DEVICE / (float) DENSITY_DEFAULT;
case COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f/72);
case COMPLEX_UNIT_IN:
return value * metrics.xdpi;
//如果要使用 inch 英寸,则进行换算
//metrics.xdpi:默认值为DENSITY_DEVICE; 为屏幕密度,不同手机数据不同
case COMPLEX_UNIT_MM:
return value * metrics.xdpi * (1.0f/25.4f);
//如果要使用 mm 毫米,则进行换算
}
return 0;
}
该函数功能:是把各单位换算为像素。
根据Android规定,在160dpi的屏幕上,1dp等于1px,而在320dpi的屏幕上,1dp等于2px。因此上面的函数都是根
据 metrics.density: 也就是 DENSITY_DEVICE / (float) DENSITY_DEFAULT; 也就是 DENSITY_DEVICE / 160
来计算的; 所以 设备的 DENSITY_DEVICE 不同 1dp对应的 px就不同。所以才可以在 不同设备屏幕上保持比例。
最后说一下
屏幕分辨率 和 屏幕密度 的区别
分辨率:是指屏幕图像的精密度,是指显示器所能显示的像素的多少。由于屏幕上的点,线和面都是由像素组成的,显示器可显示的像素越多,画面就越精细,同样的屏幕区域内能显示的信息也就越多,所以分辨率是个非常重要的性能指标之一。可以把整个图像想象成是一个大型的棋盘,而分辨率的表示方式就是所有经线和纬线交叉点的数目。
像素密度:即每英寸屏幕所拥有的像素数,像素密度越大,显示画面细节就越丰富。计算公式为像素密度={√(长度像素数^2+宽
度像素数^2)}/ 屏幕尺寸。注:屏幕尺寸单位为英寸 例:分辨率为1280*720 屏幕宽度为6英寸 计算所得像素密度约等于245