android维度之间的区别:pt和dp

该文件说160 dp(密度无关)等于1英寸。 而72磅也是1英寸。 所以我不明白为什么android定义一个dp测量,而它似乎与点相同。 有人可以解释吗? 为什么我应该使用DP如果我可以使用PT?

Android文档用于错误地指出,无论屏幕密度如何,160 dp始终等于1英寸。 这被报告为一个被接受和文档更新的错误 。

从更新的文档:

160 DP不会总是等于1英寸,它会随着不同的屏幕尺寸和密度而变化。 在密度为160dpi(mdpi)的屏幕上,160dp将等于1英寸。

无论屏幕密度如何,1点总是等于1/72英寸。

Android的文档就在这里 。

更新:

我做了一个小应用程序来尝试和validation不同的大小。 看起来上面是正确的,至less当我的macros达Aria显示。 这是一个截图:

HTC Aria资源类型测试

有趣的是,这些尺寸在eclipsegraphics编辑器中并不匹配。 dp和sp大小根据编辑器中的屏幕大小和分辨率而波动。 下面是一些来自编辑器的截图(左边是2.7in QVGA滑块,右边是10.1in WXGA,截图):

在这里输入图像说明

看看这些编辑器渲染是否与实际设备相匹配会很有趣。 任何人都能validation这些尺寸? 我会附上我的XML以防万一谁想帮忙。

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="22sp" android:padding="5sp" android:text="160dp"></TextView> <View android:id="@+id/view1" android:layout_height="20dip" android:layout_width="160dp" android:layout_marginLeft="20sp" android:background="#FF22FF22"></View> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="22sp" android:padding="5sp" android:text="72pt"></TextView> <View android:id="@+id/view2" android:layout_height="20dip" android:layout_width="72pt" android:layout_marginLeft="20sp" android:background="#FF22FF22"></View> <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="22sp" android:padding="5sp" android:text="1in"></TextView> <View android:id="@+id/View01" android:layout_height="20dip" android:layout_width="1in" android:layout_marginLeft="20sp" android:background="#FF22FF22"></View> <TextView android:layout_width="wrap_content" android:textSize="22sp" android:layout_height="wrap_content" android:text="160sp" android:padding="5sp" android:id="@+id/TextView01"></TextView> <View android:layout_marginLeft="20sp" android:layout_width="160sp" android:id="@+id/View04" android:background="#FF22FF22" android:layout_height="20dip"></View> <TextView android:layout_width="wrap_content" android:textSize="22sp" android:layout_height="wrap_content" android:padding="5sp" android:id="@+id/TextView02" android:text="160px"></TextView> <View android:layout_marginLeft="20sp" android:id="@+id/View03" android:background="#FF22FF22" android:layout_height="20dip" android:layout_width="160px"></View> <TextView android:id="@+id/textView4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="22sp" android:padding="5sp" android:text="25.4mm"></TextView> <View android:id="@+id/View02" android:layout_height="20dip" android:layout_marginLeft="20sp" android:background="#FF22FF22" android:layout_width="25.4mm"></View> </LinearLayout> 

编辑:增加了2个设备约翰的例子。 左侧是三星Nexus S(OS 2.3.3)。 在右侧,一个三星Galaxy Tab 10.1(OS 3.1)。 没有mods。

三星Nexus S三星Galaxy Tab 10.1

在Nexus S上,160dp略大于1英寸。 所有正常的物理单位(in,mm,pt)都是相同的大小。 我用一把尺子来测量它,160dp的长度比它应该大1mm。 而物理单位比他们应该短1毫米。

在选项卡上,所有的条都完全一样,比我用尺子测量的长1mm。

该文件说160 dp(密度无关)等于1英寸。 而72磅也是1英寸。

这里的细微之处在于dp (或dip约为 1英寸,而pt 恰好是 1英寸。 区别在于android如何将这两个单元转换为像素,这取决于设备的屏幕密度。


单个dp是在160 dpi的设备上的单个px 。 Android使用设备所属的“密度桶”,并乘以一个缩放器将dp转换为px

 Bucket | DPI | Scaler --------------------- ldpi | 120 | 0.75 mdpi | 160 | 1.00 tvdpi | 213 | 1.33 hdpi | 240 | 1.50 xhdpi | 320 | 2.00 xxhdpi | 480 | 3.00 

dppx按照以下公式进行转换: dp * scaler = px


在任何屏幕密度上,单个pt恰好是1/72英寸。 Android使用设备屏幕的精确dpi(xdpi和ydpi)将pt转换为px

ptpx按照以下公式进行转换: pt / 72 * dpi = px


所以我不明白为什么android定义一个dp测量,而它似乎与点相同。 有人可以解释吗? 为什么我应该使用DP如果我可以使用PT?

举一个例子,在160dpi的设备上显示dppt 。 一个160 dpi的设备属于mdpi密度桶,缩放比例为1.0。 使用上面的公式转换为px

 160 dp * 1.0 = 160 px 72 pt / 72 * 160 = 160 px 

在170 dpi设备上怎么样? 170 dpi设备属于mdpi密度桶,缩放比例为1.0。

 160 dp * 1.0 = 160 px 72 pt / 72 * 170 = 170 px 

怎么样在150 dpi的设备上? 一个150 dpi的设备属于mdpi密度桶,缩放比例为1.0。

 160 dp * 1.0 = 160 px 72 pt / 72 * 150 = 150 px 

故事的寓意是, dp保持精确的尺寸,并有助于保持性能,允许一些物理尺寸的变化取决于设备的密度。 另一方面, pt在每个密度上的物理尺寸是完全相同的,这导致使用不同数量的px ,如果在图像上使用,会妨碍性能并导致混叠和伪像。 build议使用dp ,除非需要绝对精确的物理尺寸(屏幕上有标尺等)。

我已经在Android的维度单元上编写了一个深入的博客,它提供了更多信息和示例代码 – 了解Android中的密度独立

出于好奇,我尝试了John在我的两个设备上的回答:Asus Transformer(10.1英寸)和HTC Legend(3.2英寸)。 结果非常有趣:

变压器(裁剪):

变压器

和传说:

传说

我一直在努力维护,但我想我已经find了一种对我来说很有意义的方法。 李维明的“开始Android 4应用程序开发”(第111页)中有一个转换公式:

实际像素= dp *(dpi / 160),其中dpi是120,160,240或320

所以,使用该公式,我可以find我的手机/模拟器的哪个dpi最接近这四个值中的一个,并确定公式中用于转换的比率(3/4,1,3/2或2) DP到像素。 对于我来说,公式中的dpi只能假设这四个值中的一个,尽pipe实际的设备像素密度是重要的。

参考: http : //en.wikipedia.org/wiki/List_of_displays_by_pixel_density ,对于像素密度为235 dpi的Nexus S,转换为:

像素= dp * 3/2

所以一个160dp的button就是240px(比设备的235dpi宽一英寸)

对于HTC Legend,像素密度为181 dpi的公式为:

像素= dp * 1

(因为181最接近160)。 所以160dp的button将是160pixels,或略低于设备的像素密度为181dpi的一英寸

这有助于我理解以前的Android文档的不正确之处:“无论屏幕密度如何,1DP总是等于1/160英寸”。

这些是我想要得到的两个要点:)

  1. 一系列实际器件像素密度(例如:141-199)将导致在转换公式中相同的比率(1)
  2. 但是除非特定设备的像素密度恰好为160dpi,否则设备上的160dp不会是一英寸……高于或低于,但不完全

点数 – 基于屏幕物理尺寸的1/72英寸。

dp 密度独立像素 – 基于屏幕物理密度的抽象单位。 这些单位是相对于一个160 dpi的屏幕,所以一个DP是160 dpi屏幕上的一个像素。 dp与像素的比率将随着屏幕密度而改变,但不一定成正比。 注:编译器同时接受“dip”和“dp”,但“dp”与“sp”更加一致。

为什么我应该使用DP如果我可以使用PT?

开发人员习惯于以像素为单位来思考事物。 与密度无关的像素是Android接近开发人员习惯的方式。 也就是说,如果您愿意,欢迎您使用点数,英寸或毫米。

无论屏幕密度如何,1DP将始终等于1/160英寸。

这是不正确的,如你的申请所示…同意?

BR STeN