dp是物理尺寸單位嗎?

引言:

我在回龍觀買了1000平方dp的房子html

這種用法正確嗎?若是正確,那麼如今回龍觀的房價是多少1平方dp呢?android

dp是物理單位嗎?

dp,全稱是Density-independent Pixels, 設備獨立像素, 在大多的android開發書籍裏面是這麼定義的:bash

an abstract unit that is based on the physical density of the screen. These units are relative to a 160 dpi screen, so one dp is one pixel on a 160 dpi screen.app

維基百科裏的定義:ui

A device-independent pixel (also: density-independent pixel, dip, dp) is a physical unit of measurement based on a coordinate system held by a computer and represents an abstraction of a pixel for use by an application that an underlying system then converts to physical pixels.google

根據上面的描述,維基百科甚至直接說了他是一個物理單位(physical unit of measurement), physical unit of measurement 就相似於cm, mm, inch這樣的東西了.spa

然而在實際應用過程當中,不多有人把當dp作物理單位使用,不一樣於pt, pt在印刷行業等同於1/72 inch(photoshop可查), 在IOS中,蘋果公司定義1pt = 1/163 inchcode

An iOS point is equivalent to 1/163 of an inch.cdn

詳見Mobile design 101: pixels, points and resolutionshtm

那麼

dp究竟是不是物理單位呢? 若是是應該等於多長?

下面分兩個部分來討論:

  • 爲何dp是物理單位?
  • 爲何dp不是物理單位?

爲何dp是物理單位

根據dp的定義,1dp大小等同於160ppi屏幕上的1個物理像素大小. 這裏須要說一下ppi的概念,

ppi

ppi(pixels per inch)在概念上等同於 dpi(dot per inch), 只是應用領域的區別,在用像素顯示的顯示器上,這裏統一用ppi來解釋。

咱們常把ppi理解爲像素密度, 你們有沒有想過爲何單位長度指標用來表示密度?

這裏講得囉嗦了一點,但概念落到實處對理解問題比較有幫助,

ppi是線密度, 表示對角線有多少個物理像素的長度. (劃個重點,不是對角線上有多少個物理像素,而是多少個物理像素的長度, 是長度/長度,不是個數/長度)


舉個🌰, 4.7英寸的屏幕,分辨率是1334x750,對應的ppi是326

ppi是經過

Math.sqrt(1334 * 1334 + 750 * 750) / 4.7
複製代碼

計算獲得的,密度爲何能夠用線密度來衡量, 這個緣由很簡單:

像素是方形的,因此用屏幕對角線的長度來表示就足夠了。

計算dp的尺寸

經過 ppi 的定義, 咱們應該就能很方便的計算 dp 的尺寸了:

160ppi 屏幕上,每英寸對角線上有160個物理像素的長度,因此1個物理像素 = 1 / 160 inch,

根據dp的定義 1dp = 160ppi 屏幕上一個物理像素的長度 = 1 / 160 inch.

那麼看起來 dp 確實是一個物理尺寸,而且就等同於 1 / 160 inch, 用一個更加熟悉的單位,也就是 0.015875cm.

可是,

不少地方並無把 dp 當作一個物理尺寸用,

看下面的這個表格

+---------+-------------+---------------+-------------+--------------------+
| Unit    | Description | Units Per     | Density     | Same Physical Size |
|         |             | Physical Inch | Independent | On Every Screen    |
+---------+-------------+---------------+-------------+--------------------+
| px      | Pixels      | Varies        | No          | No                 |
+---------+-------------+---------------+-------------+--------------------+
| in      | Inches      | 1             | Yes         | Yes                |
+---------+-------------+---------------+-------------+--------------------+
| mm      | Millimeters | 25.4          | Yes         | Yes                |
+---------+-------------+---------------+-------------+--------------------+
| pt      | Points      | 72            | Yes         | Yes                |
+---------+-------------+---------------+-------------+--------------------+
| dp      | Density     | ~160          | Yes         | No                 |
|         | Independent |               |             |                    |
|         | Pixels      |               |             |                    |
+---------+-------------+---------------+-------------+--------------------+
| sp      | Scale       | ~160          | Yes         | No                 |
|         | Independent |               |             |                    |
|         | Pixels      |               |             |                    |
+---------+-------------+---------------+-------------+--------------------+
複製代碼

這張表格來自這個問題的回答: What is the difference between 「px」, 「dip」, 「dp」 and 「sp」?

在 dp 這一欄,能夠看到 Same Physical Size On Every Screen 是 No, 意思就是他不是物理單位,那麼爲何呢?

爲何dp不是物理單位

看一下android對屏幕密度的的範圍定義:

+----------------+----------------+
| Density Bucket | Screen Density |
+----------------+----------------+
| ldpi           | 120 ppi        |
+----------------+----------------+
| mdpi           | 160 ppi        |
+----------------+----------------+
| hdpi           | 240 ppi        |
+----------------+----------------+
| xhdpi          | 320 ppi        |
+----------------+----------------+
| xxhdpi         | 480 ppi        |
+----------------+----------------+
| xxxhdpi        | 640 ppi        |
+----------------+----------------+
複製代碼

這裏是官方給出的Bucket的定義, 可是咱們都知道,爲何 android 這麼難搞,由於 android 廠商太多了,怎麼說來着,他們都有本身的想法。

引用一段說明:

That being said, most phone screens do not fit in perfectly into any bucket. What happens then is that android fits them into the closest bucket which can cause the number of pixel per dp to stray from the bucket amount.

也就是說不一樣廠商不必定就能徹底生產符合160ppi的屏幕,只能劃分一個範圍就近放進 bucket 裏面去了,是否是很像桶排序

google 很無奈,最後就變成了這樣:

數據來源:pixels-per-inch

+----------------+----------------+
| Density Bucket | Screen Density |
+----------------+----------------+
| ldpi           | 120 ppi        |
+----------------+----------------+
| mdpi           | 120-160 ppi    |
+----------------+----------------+
| tvdpi          | 160-213 ppi    |
+----------------+----------------+
| hdpi           | 213-240 ppi    |
+----------------+----------------+
| xhdpi          | 240-320 ppi    |
+----------------+----------------+
| xxhdpi         | 320-480 ppi    |
+----------------+----------------+
| xxxhdpi        | 480-640 ppi     |
+----------------+----------------+
// 大家愛怎麼玩怎麼玩,咱們都包容了。
複製代碼

所以,在實際使用中,dp 不能徹底等同於 1/160 inch, 而是在這個值周圍浮動,因此上面的表格用了 ~160 這個符號, (🍎公司看了一下 pt,表示笑而不語)

// 因此買房的時候也最好不要用平方dp來衡量了

對了

關於這個疑問,我以前有在Stack Overflow提了: Is dp (Density-independent Pixels) a Physical Size?,

你們有興趣能夠看一下

Reference

相關文章
相關標籤/搜索