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

Her*_*ert 51 android measurement dimension

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

Joh*_*hey 74

Android文档曾经错误地指出,无论屏幕密度如何,160 dp始终等于1英寸.据报道,这是一个被接受并且文档更新的错误.

从更新的文档:

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

无论屏幕密度如何,1 pt总是等于1/72 in.

这里的Android文档就在这里.

更新:

我做了一个小应用程序来尝试验证不同的大小.看起来上面的内容是正确的,至少在我的HTC Aria上显示.这是一个截图:

HTC Aria资源类型测试

有趣的是,这些尺寸在eclipse图形编辑器中并不完全匹配.dp和sp大小根据屏幕大小和编辑器中的分辨率而变化.以下是编辑器的一些截图(左边是2.7英寸QVGA滑块,右边是10.1英寸WXGA,剪裁):

在此输入图像描述

看看这些编辑器渲染是否与实际设备匹配将会很有趣.有人可以验证这些尺寸吗?如果有人想帮忙,我会在下面附上我的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>
Run Code Online (Sandbox Code Playgroud)

编辑:在John的示例中添加了2个以上的设备.左侧是Samsung 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)都是相同的大小.我用尺子测量它,160 dp的棒比它应该大约1mm.而物理单位比他们应该短1毫米.

在标签上,所有条形都完全相同,比我用尺子测量的长1毫米.


Ste*_*yle 38

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

这里的细微差别是160 dp(或dip)为大致 1英寸,而72 pt恰好 1英寸.不同之处在于android如何将两个单位转换为像素,这取决于设备的屏幕密度.


单个dppx160 dpi的设备上的单个.Android使用设备所属的"密度桶",并将转换器乘以转换dppx.

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
Run Code Online (Sandbox Code Playgroud)

dppx按照这个公式进行转换:dp * scaler = px.


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

ptpx按照这个公式进行转换:pt / 72 * dpi = px.


所以我不明白为什么android定义一个dp测量,而它似乎与点相同.任何人都可以解释一下吗?如果我可以使用pt,为什么要使用dp?

举个例子,在160 dpi设备上显示160 dp和72 pt.160 dpi设备落入mdpi密度桶中,缩放器为1.0.使用上面的公式转换为px.

160 dp * 1.0 = 160 px
72 pt / 72 * 160 = 160 px
Run Code Online (Sandbox Code Playgroud)

在170 dpi设备上怎么样?170 dpi的设备落入mdpi密度桶,缩放器为1.0.

160 dp * 1.0 = 160 px
72 pt / 72 * 170 = 170 px
Run Code Online (Sandbox Code Playgroud)

在150 dpi设备上怎么样?150 dpi的设备落入mdpi密度桶,缩放器为1.0.

160 dp * 1.0 = 160 px
72 pt / 72 * 150 = 150 px
Run Code Online (Sandbox Code Playgroud)

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

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