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

时间:2011-07-11 21:14:15

标签: android measurement dimension

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

7 个答案:

答案 0 :(得分:71)

Android文档曾经错误地指出,无论屏幕密度如何,160 dp始终等于1英寸。报告为bug,已被接受,文档已更新。

从更新的文档:

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

无论屏幕密度如何,

1 pt总是等于1/72 in。

Android文档为here

<强>更新

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

HTC Aria resource type test

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

enter image description here

看看这些编辑器渲染是否与实际设备匹配会很有趣。有人可以验证这些尺寸吗?我会在下面附上我的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>

编辑:在John的示例中添加了2个以上的设备。左侧是Samsung Nexus S(OS 2.3.3)。在右侧,三星Galaxy Tab 10.1(OS 3.1)。没有mods。

Samsung Nexus S Samsung Galaxy Tab 10.1

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

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

答案 1 :(得分:38)

  

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

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


单个dp是160 dpi设备上的单个px。 Android使用&#34;密度桶&#34;设备会落入并与缩放器相乘以将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测量,而它似乎与点相同。任何人都可以解释一下吗?如果我可以使用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

在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,如果在图像上使用,可能会影响性能并导致混叠和伪影。除非需要绝对精确的物理尺寸(屏幕上有标尺等),否则建议使用dp

我在Android的维度单元上写了一篇深度博客,提供了更多信息和示例代码 - Understanding Density Independence in Android

答案 2 :(得分:3)

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

变形金刚(裁剪):

Transformer

和传奇:

Legend

答案 3 :(得分:3)

我一直在努力维度,但我想我已经找到了一种对我有用的方法。李伟萌的“开始Android 4应用程序开发”(第111页)中有一个转换公式:

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

因此,使用该公式,我可以找到我的手机/模拟器的哪个dpi最接近这四个值中的一个,并且将确定使用的比率(3 / 4,1,3 / 2或2)将dp转换为像素的公式。对我来说很重要的是,尽管有实际的器件像素密度,公式中的dpi只能假设这四个值中的一个。

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

pixels = dp * 3/2

因此,一个160dp的按钮,将是240px(比设备的235 dpi宽一英寸)

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

pixels = dp * 1

(因为181最接近160)。因此,160dp按钮将是160像素,或者设备上的略小于1英寸,其像素密度为181dpi。

这有助于我理解以前Android文档的不正确性“1 dp总是等于1 / 160in,无论屏幕密度如何”。

这是我想要解决的两个要点:)

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

答案 4 :(得分:3)

<强> PT 点数 - 基于屏幕物理尺寸的1/72英寸。

<强> DP 与密度无关的像素 - 基于屏幕物理密度的抽象单元。这些单位相对于160 dpi的屏幕,因此一个dp是160 dpi屏幕上的一个像素。 dp与像素的比率将随着屏幕密度而变化,但不一定成正比。注意:编译器同时接受“dip”和“dp”,但“dp”与“sp”更加一致。

答案 5 :(得分:2)

  

如果我可以使用pt,为什么要使用dp?

开发人员习惯于用像素来思考问题。与密度无关的像素是Android接近开发人员习惯的方式。话虽如此,如果您愿意,欢迎使用积分,英寸或毫米。

答案 6 :(得分:1)

无论屏幕密度如何,

1 dp始终等于1/160 in。

如您的申请所示,情况并非如此......同意?

BR 斯登