【问题标题】:Difference between android dimension: pt and dpandroid维度的区别:pt和dp
【发布时间】:2011-07-11 21:14:14
【问题描述】:

文档说 160 dp(与密度无关)等于 1 英寸。 72 pt 也是 1 英寸。所以我不明白为什么 android 定义一个 dp 测量,而它似乎与点工作相同。有人能解释一下吗?能用pt为什么还要用dp?

【问题讨论】:

  • Android 文档现已更新,删除了 160 dp 等于 1 英寸的错误说法。

标签: android measurement dimension


【解决方案1】:

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

来自更新的文档:

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

无论屏幕密度如何,1 pt 始终等于 1/72 in。

Android 文档是here。

更新:

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

有趣的是,这些尺寸在 Eclipse 图形编辑器中并不完全匹配。 dp 和 sp 大小会根据屏幕大小和编辑器中的分辨率而波动。下面是一些编辑器的截图(左边是 2.7in QVGA 滑块,右边是 10.1in 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>

编辑:在 John 的示例中添加了另外 2 个设备。左侧是三星 Nexus S (OS 2.3.3)。右侧是三星 Galaxy Tab 10.1 (OS 3.1)。没有模组。

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

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

【讨论】:

  • 像素依赖于密度,而DP代表密度无关。从文档中:“所以无论屏幕密度如何,160dp 始终是一英寸”
  • 实际上,赫伯特,我也不确定我原来的更新帖子是否正确。我认为 320 dp 将始终等于 2 英寸,无论屏幕如何。我再次更新我的帖子。
  • 是的,我很困惑。也许我错过了一些东西,但似乎 1 DP = 160/72 pt
  • 是的,我认为你是对的。这对我来说很有趣,我不知道这两个变量都是与密度无关的。
  • 顺便说一句,赫伯特,1 DP = 72/160 pt :D
【解决方案2】:

文档说 160 dp(与密度无关)等于 1 英寸。 72 pt 也是 1 英寸。

这里的细微差别是 160 dp(或 dip)大约 1英寸,而 72 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

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


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

pt 到 px 按照以下公式进行转换: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

【讨论】:

  • 5.1 英寸到 5.4 英寸(sw480dp)怎么样
  • @cammando 物理尺寸!= sw###dp != dpi。阅读我的博客,它应该可以帮助您了解其中的差异。
【解决方案3】:

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

变形金刚(裁剪):

还有传说:

【讨论】:

  • 这对我来说真的很有趣,因为我的印象是 HTC Legend 和 HTC Aria 是一样的......奇怪!
  • 没关系...我刚刚意识到我使用的是解放的 Legend 2.2 ROM,尽管它们是相同的:P
  • 有趣。根据Wikipedia 的说法:HTC Aria 具有“与 HTC Desire 和 HTC Legend 相同的软件”,但 Legend 没有电容式按钮。我想知道是什么导致了这种差异?我正在我的 Legend 上运行 Cyanogenmod。
  • 那肯定和ROM有关。我可以在我的 aria 上尝试 Cyanogenmod rom,我已经在 SD 上,但我暂时不能。
  • Transformer 的 dpi 为 160,所以在这种情况下 160dp 实际上是 1 英寸,所以所有线的长度都相同。
【解决方案4】:

我一直在努力解决维度问题,但我认为我找到了一种对我来说有意义的看待它的方式。 Wei-Meng Lee 的“开始 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,转换为:

像素 = dp * 3/2

例如,一个 160dp 的按钮将是 240 像素(在设备的 235 dpi 下比一英寸宽一点)

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

像素 = dp * 1

(因为 181 最接近 160)。所以 160dp 按钮在像素密度为 181dpi 的设备上为 160 像素,或略小于一英寸。

这有助于我理解之前的 Android 文档“1 dp 将始终等于 1/160in,无论屏幕密度如何”的错误。

这是我试图在脑海中理解的两个要点 :)

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

【讨论】:

    【解决方案5】:

    pt 点 - 基于屏幕物理尺寸的 1/72 英寸。

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

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

      • 但是,如果您更喜欢使用磅、英寸或毫米,则将您的应用扩展到不同的屏幕尺寸时会遇到更多问题。
      • @AshtonBRSC 为什么会这样?假设我将所有dips 除以160,然后将dip 更改为inch,这有什么区别?
      • @Pacerier 我认为他的意思是,如果您以英寸为单位制作所有尺寸,它们将始终保持该尺寸。换句话说,3.5 英寸小型手机上的 1 英寸按钮在 10 英寸平板电脑上仍然是 1 英寸(您可能希望按钮放大一点)。
      • @Pacerier,根据 android 文档,没有区别,但是如果您阅读我和 howettl 的回答,屏幕应该显示的内容与实际显示的内容之间显然存在某种不连续性在某些设备上显示。
      • @Pacerier,使用尺子没什么问题,我只是没有...如果您想验证什么是对什么是错,请继续!
      【解决方案7】:

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

      您的应用程序显示这不是真的...同意吗?

      BR 钢

      【讨论】:

      • 你是对的,1 dp 会因设备而异。当 Android 文档说“无论屏幕密度如何,160dp 始终为一英寸”时,它是错误的。
      • 很难让应用程序在各种平板电脑和操作系统版本上正确运行......从这个角度来看,iPad 更容易......
      • iOS 目前更容易,但 Apple 在使用其当前布局系统可以提供的屏幕分辨率方面受到限制。这就是为什么 iPhone 4 的分辨率正好是两倍大小的原因——因此可以使用具有绝对定位的相同布局。 iPhone 布局不能在 iPad 上重复使用,但在 Android 上,手机布局可以在平板电脑上使用。 Android 更加灵活,只是需要更多的工作。如果文档没有这样的错误会有所帮助。
      • @STeN 你是说我们应该使用 inch 还是 dp ?
      • @Pacerier 永远不要使用英寸,除非你正在做一些事情,比如在屏幕上放一把尺子,它确实必须以英寸为单位。 Android 屏幕尺寸从大约 2.5 英寸到超过 10 英寸不等,因此您最终会得到在大多数屏幕尺寸上看起来很糟糕的布局。基本上,除非您知道为什么要使用不同的大小单位,否则请始终使用 dp 和 sp。
      猜你喜欢
      • 2017-07-19
      • 1970-01-01
      • 1970-01-01
      • 2013-05-18
      • 2020-02-24
      • 2019-07-28
      • 2011-01-02
      • 2016-12-20
      • 2013-11-30
      相关资源
      最近更新 更多