Android : dip/dp与px(pixel)之间的相互转换

来源:互联网 发布:搜狗关键词优化推广 编辑:程序博客网 时间:2024/06/05 23:14

原文:http://blog.sina.com.cn/aoyousatuo


在Android应用的开发过程中,我们常常需要给组件布局定位。这就涉及到Android常用的两个计量单位dip/dp, px.下面笔者就这两个单位做一个简要的介绍。

dip或者dp是device independent pixels(设备独立像素)的缩写。这个单位提出的目的主要是为了让应用的UI布局适应各种分辨率的显示设备。Android会将dp最终转换成具体显示设备的像素数,这样就提高了程序的可移植性。

px是pixel的缩写,它表示一个实实在在的物理像素。这个单位使用起来比较方便,但是组件一旦定位就固定了,它不会随着设备的分辨率不同而改变,使用该单位的程序可移植性较差。

举个例子,在400像素宽的屏幕上从第0个像素到第399个像素画一条横线,我们可以看到这条线横向贯穿了整个屏幕,然后我们将相同的画线程序运行在800像素宽的屏幕上,则我们只能看到这条线只有屏幕的一半。如果换作dp为单位,则在这两种分辨率的屏幕上的线基本都横向贯通。

所以在开发中,为了提高程序对各种设备的适应性,我们最好使用dp或者dip为单位。知道了这两个单位的特点,问题就来了。我们发现虽然一些组件可以在布局文件中通过dip或者dp单位来定构。但是,组件类的相关方法却只能以像素为单位。例如,设置GridView组件类的列间距。这种情况下就涉及到了dip/dp与px之间的相互转换。笔者直接给出两个方法大家就清楚了,请看:

 

public int dip2px(Context context, floatdipValue)

{

floatm=context.getResources().getDisplayMetrics().density ;

return (int)(dipValue * m + 0.5f) ;

}

 

public int px2dip(Context context, floatpxValue)

{

  float m=context.getResources().getDisplayMetrics().density;

  return (int)(pxValue / m + 0.5f) ;

}


面对Android设备那混乱的硬件体系,最淡定的开发者也会不免蛋疼起来。在做Android UI的时候,考虑最多的就是这些不同设备的适配问题。在为不同分辨率设计不同UI的时候,我们首先要知道目标设备的分辨率到底是多少。如何计算出来?

水果手机经常喜欢用分辨率超过人眼极限来标榜自己的设备有多么牛B,据说iPhone 4S的分辨率达到了326 PPI(pixel per inch),这个数值的计算公式为:

开方(屏幕宽度平方+屏幕高度平方)÷对角线尺寸

iPhone 4S,960×640像素,对角线尺寸3.5英寸,用上面的公式计算结果如下:

sqrt(sqr(960) + sqr(640)) / 3.5 ≈ 329.65

看来水果公司并未说谎。只是3.5寸的屏搞这么高的分辨率,考视力么?

和水果比起来,Android就更加复杂了,它把屏幕分成small,normal,large,xlarge四种,其对应的屏幕尺寸如下:

  • xlarge 至少960dp x 720dp
  • large 至少640dp x 480dp
  • normal 至少470dp x 320dp
  • small 至少426dp x 320dp

dp(Density-independent pixel)是一个密度无关的像素单位,是用来表示基于160 dpi的设备计算出来的虚拟像素。


0 0
原创粉丝点击