android尺寸之间的区别:pt和dp

发布于 2024-11-19 16:04:54 字数 115 浏览 3 评论 0 原文

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

The documentation says that 160 dp (density-independent) equals 1 inch. And 72 pt is also 1 inch. So I don't see why android define a dp measurement while it seems to work the same as points. Can anybody explain that? Why should I use dp if I can use pt?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

吻安 2024-11-26 16:04:54

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

根据更新的文档:

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

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

有关此内容的 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>

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

三星 Nexus S 三星Galaxy Tab 10.1

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

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

The Android documentation used to incorrectly state that 160 dp always equals 1 inch regardless of screen density. This was reported as a bug which was accepted and the documentation updated.

From the updated documentation:

160 dp will NOT always equal 1 inch, it will vary with different screen sizes and densities. On a screen with a density of 160dpi (mdpi), 160 dp will equal 1 inches.

1 pt will always equal 1/72 in, regardless of the screen density.

The Android documentation for this is here.

UPDATE:

I made a small application to try and verify the different sizes. It looks like what is above is correct, at least when shown on my HTC Aria. Here is a screenshot:

HTC Aria resource type test

It's interesting to note that these sizes did NOT match up exactly in the eclipse graphical editor. The dp and sp sizes wavered depending on the size of the screen and resolution in the editor. Here are some screenshots from the editor (left is 2.7in QVGA slider, right is 10.1in WXGA, clipped):

enter image description here

It would be interesting to see if these editor renders match up with the actual devices. Can anyone verify these sizes? I'll attach my xml below in case anyone wants to help out.

<?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>

Edit: Added 2 more devices to John's example. On the left a Samsung Nexus S (OS 2.3.3). On the right, a Samsung Galaxy Tab 10.1 (OS 3.1). No mods.

Samsung Nexus S Samsung Galaxy Tab 10.1

On the Nexus S, 160dp is slightly larger than 1 inch. All the normal physical units (in, mm, pt) are all the same size. I measured it with a ruler, and the 160 dp bar is about 1mm larger than it should. While the physical units are 1mm shorter than they should.

On the Tab, all bars are exactly the same, and 1mm longer than what I measured with a ruler.

做个ˇ局外人 2024-11-26 16:04:54

文档称 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

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 尺寸单位的深入博客,其中提供了更多信息和示例代码 - 理解Android 中的密度独立

The documentation says that 160 dp (density-independent) equals 1 inch. And 72 pt is also 1 inch.

The nuance here is that 160 dp (or dip) is roughly 1 inch, while 72 pt is exactly 1 inch. The difference is how android converts both units to pixels, which depends on the screen density of the device.


A single dp is a single px on a device at 160 dpi. Android uses the "density bucket" the device falls into, and multiplies a scaler to convert dp to 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 to px converts following this formula: dp * scaler = px.


A single pt is exactly 1/72 of an inch on any screen density. Android converts pt to px using the exact dpi (xdpi and ydpi) of the device's screen.

pt to px converts following this formula: pt / 72 * dpi = px.


So I don't see why android define a dp measurement while it seems to work the same as points. Can anybody explain that? Why should I use dp if I can use pt?

Take an example, display 160 dp and 72 pt on a 160 dpi device. A 160 dpi device falls into the mdpi density bucket, with a scaler of 1.0. Use the formulas above to convert to px.

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

What about on a 170 dpi device? A 170 dpi device falls into the mdpi density bucket, with a scaler of 1.0.

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

What about on a 150 dpi device? A 150 dpi device falls into the mdpi density bucket, with a scaler of 1.0.

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

The moral of the story is, dp keeps exact dimensions and helps keep performance, allowing some physical size variation depending on device density. On the other hand, pt is exactly the same physical size on every density, which leads to a different amount of px being used, which can hinder performance and cause aliasing and artifacts if used on images. dp is recommended unless absolutely exact physical dimensions are required (you have a ruler on screen, etc).

I have written an in depth blog on Android's dimension units, which gives more info and sample code - Understanding Density Independence in Android

心在旅行 2024-11-26 16:04:54

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

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

Why should I use dp if I can use pt?

Developers are used to thinking of things in terms of pixels. Density-independent pixels was Android's way of getting close to what developers are used to. That being said, you are welcome to use points, inches, or millimeters if you prefer.

把昨日还给我 2024-11-26 16:04:54

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

Transformer(裁剪):

Transformer

和图例:

Transformer 和图例:图例

Out of curiosity, I tried the layout from John's answer on my two devices: Asus Transformer (10.1 in) and HTC Legend (3.2 in). The results were pretty interesting:

Transformer (cropped):

Transformer

And Legend:

Legend

往日 2024-11-26 16:04:54

我一直在与维度斗争,但我想我已经找到了一种对我来说有意义的看待它的方式。 Wei-Meng Lee 的《Beginning Android 4 Application Development》(第 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_desired,对于 Nexus S像素密度为 235 dpi 时,转换为:

像素 = dp * 3/2

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

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

像素 = dp * 1

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

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

这是我想要记住的两个要点:)

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

I've struggled with dimensions but I think I've found a way of looking at it that makes sense to me. There's a conversion formula in Wei-Meng Lee's "Beginning Android 4 Application Development" (pg 111):

Actual pixels = dp * ( dpi / 160 ), where dpi is either 120, 160, 240 or 320

So, using that formula, I can find which dpi for my phone/emulator is closest to one of those four values and that'll determine the ratio (3/4, 1, 3/2 or 2) used in the formula to convert dp to pixels. It's important to me that dpi in the formula can only assume one of those four values despite the actual device pixel density.

Referring to: http://en.wikipedia.org/wiki/List_of_displays_by_pixel_density, for a Nexus S with a pixel density of 235 dpi the conversion is:

pixels = dp * 3/2

So a 160dp button, say, would be 240px (a little wider than an inch with the device's 235 dpi)

For an HTC Legend, with a pixel density of 181 dpi the formula is:

pixels = dp * 1

(because 181 is closest to 160). So that 160dp button would be 160pixels, or slightly less than an inch on the device with its pixel density of 181dpi.

This helps me understand the incorrectness of the previous Android documentation "1 dp will always equal 1/160in, regardless of screen density".

These are the two main points I'm trying to get in my head :)

  1. a range of actual device pixel densities (for example: 141-199) will result in the same ratio (1) in the conversion formula
  2. but unless the pixel density of a particular device is exactly 160 dpi, the 160 dp won't be an inch on the device...close above or below, but not exactly
淤浪 2024-11-26 16:04:54

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

正如您的应用程序所示,这不是真的...同意吗?

BR
斯坦恩

1 dp will always equal 1/160 in, regardless of screen density.

This is not true as shown by your application... Agree?

BR
STeN

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文