在分辨率没有牛逼到爆的过去,程序员通常以像素为单位设计计算机用户界面。例如,图片大小为80×32像素。这样处理的问题在于,如果在一个每英寸像素点数更高的新显示器上运行该程序,则用户界面图标会显得很小。在有些极端情况下,用户界面会小到难以看清内容。因为我们在Android应用程序开发中应使用与分辨率无关的度量单位。
Android支持dp、sp、px、pt等各种度量单位,下面介绍一下它们的概念和区别。
这里的换算规则主要是介绍px、dp、sp的换算规则。
从UI设计师和开发工程师的角度理解:
px(像素)是UI设计师在PS里使用的,同时也是手机屏幕上所显示的。
dp是开发工程师写layout的时候使用的尺寸单位,sp是开发写layout时关于字体的字号单位,且dp与sp总为1:1关系。
所以,UI设计师给出效果图时,标记的单位如果是dp或者sp,开发工程师就可以直接写Layout布局xml文件了。但是,如果UI设计师给出的单位是像素(px),那苦逼的开发工程师就要自行换算了。
由于不同的手机或平板有不同的像素密度,而开发人员不可能为每款不同像素密度的手机开发相同的应用,因此Android想到了这点,Android系统本身定义了六种像素密度:
低(120dpi)、中(160dpi)、高(240dpi)、超高(320dpi)、超超高(480dpi)
由于在160dpi像素密度的情况下:px = dp,当在其他像素密度时,pxe和dp的换算规则是:
因为,在低、中、高、超高、超超高像素密度下,dp到px的换算系数分别为:
低(0.75)、中(1)、高(1.5)、超高(2)、超超高(3)
有了这个换算系数后,那假设UI设计师在在超高像素密度(xh)的手机上给你200px像素值宽度时,那你写在xml里对应的dp应该为:100dp。
dp和px的代码转换方法如下:
public static int dpTopx(Context context, float dpValue){
final float scale = context.getResources().getDisplayMetrics().density;
return (int)(dpValue * scale + 0.5f);
}
public static int pxTodp(Context context, float pxValue){
final float scale = context.getResources().getDisplayMetrics().density;
return (int)(pxValue / scale + 0.5f);
}
原文地址:http://blog.csdn.net/wzy_1988/article/details/43732467