px、dp、dip、dpi、sp 等到底有什麼聯繫區別?產生的根源和設計時的影響如何?是否屏幕密度的決定原因?


補充 @醬油會飛 @樊旭

從UI設計師的角度理解:
px(像素)是我們UI設計師在PS里使用的(不解釋),同時也是手機屏幕上所顯示的(也不解釋)
dp是開發寫layout的時候使用的尺寸單位,sp是開發寫layout時關於字體的字型大小單位,且dp與sp總為1:1關係。

Android支持四種不同的dpi模式:ldpi mdpi hdpi xhdpi

一般地,手機解析度與所運行的dpi模式是匹配的,例如hvga(320x480像素)的手機屏幕一般在3.5英寸左右,運行在mdpi模式下(也有例外,稍後解釋)(這個是ROM控制的,app不能改變)。當運行在mdpi下時,1dp=1px:也就是說設計師在PS里定義一個item高48px,開發就會定義該item高48dp;Photoshop中14px大的字體,開發會定義為14sp。

對於一部wvga(480x800)手機(G7、N1、NS),一般是運行在hdpi模式下。當運行在hdpi模式下時,1dp=1.5px:也就是說設計師在PS里定義一個item高72px,開發就會定義該item高48dp;Photoshop中21px大的字體,開發會定義為14sp。

所以,當你的app需要適配多個dpi模式的時候(例如同時適配mdpi與hdpi),若你在wvga下做設計,你需要將你的各數值都為3的倍數,並在切圖標註時將所有的數字除以3乘以2換算成dp,這樣開發的同一套layout就能用在兩個不同的dpi模式下,而不是寫兩套layout。

mdpi與hdpi是2:3的關係
mdpi與xhdpi是1:2的關係
ldpi與mdpi是3:4的關係

Galaxy Nexus 是720P屏幕,就是運行在xhdpi下的。

可以想見為什麼iOS的開發者升級到 Retina Display 是多麼的無痛

再補充一種例外,有些比較山寨的Pad有可能是7英寸屏幕,解析度為wvga(480x800)運行在mdpi下,所以一部wvga手機是320x533dp,一部wvga平板是480x800dp,可以顯示的內容會多很多。

我語言沒有梳理的很清楚,希望你看得懂:P

可以參考:http://developer.android.com/design/style/devices-displays.html 以及 Supporting Multiple Screens


px (pixels)像素 -- 是像素,就是屏幕上實際的像素點單位。
dip或dp (device independent pixels)設備獨立像素, 與設備屏幕有關。
sp (scaled pixels — best for text size)放大像素-- 主要處理字體的大小。
dpi:屏幕像素密度。

至於根源。
android最早是沒有考慮到這麼多屏幕解析度的。最早的機器是g1,他的解析度是480*320。但是,由於android是開放的平台,各種各樣解析度的設備都可以運行。為了兼容這些平台,android從1.6開始,加入了設備獨立像素,dip或者dp。標準屏幕480*320上,px與dp是1比1的。解析度高的,比如800*480,就要按比例兌換成480*320。
開發者在開發的時候,ui設計時最好用dp,系統會自動按比例計算為px,從而適配視圖。
sp我一直以為是跟dp一樣的,今天一查,估計是專門配置字體大小的。不過,這個問題不是很大,dp也是可以的。

dpi是屏幕像素密度。就是1英寸上像素點的個數。對於屏幕來說,dpi越大,屏幕的精細度越高,屏幕看起來就越清楚。比如iphone4的視網膜級的屏幕肯定比iphone 3gs的屏幕像素密度高的多。 對於開發者來說,這個不是很重要。

都是自己的一些體會。關於根源你可以看看開發者文檔,那裡面有詳細的解釋。


px( pixel) 像素,可以簡單的理解為一個點或方塊,用以顏色的顯示(單位),一般指印刷品或屏幕設置設備的顏色顯示定義。

dip(device independent pixels)設備獨立像素. 不同設備有不同的顯示效果,這個和設備硬體有關,多為了支持WVGA、HVGA和QVGA 使用,不依賴像素。

dpi(dots per inch)解析度、解析度,每英寸像素數,多用於屏幕顯示領域。類似的有ppi(Pixels per inch)多用於印刷領域。解析度越高,則每英寸內包含的像素數越大。

sp (scaled pixels)像素(圖像)縮放,在 常規情況下,尺寸大的圖像(像素數量或密度高)縮放為小圖像(像素數量或密度小)時清晰度不變或清晰(原圖模糊時),逆向則反之。但可以通過像素插值/超樣採集等技術實現相對清晰(計算輪廓邊緣模擬出相似或智能分析增加清晰度、圓潤感)

px(像素)和dpi(解析度)的關係,解析度表示每英寸內包含多少個像素,比如解析度為72dpi時,即表明每英寸內有72個像素。在屏幕顯示時像素和屏幕上的點可以是點對點或非點對點。

sp(像素縮放)和px、dpi之間沒有直接換算關係,比如一個原始圖像為100×100px時,把它縮放為60×60或40×80(等比例縮放或自由縮放)相關的像素排列和原始顏色會打亂,減低或保持包含顏色數量(在常規放大時不會增加包含的顏色數量),邊緣顏色數量會減少。

dip和以上有些相似,這個因為未涉及不是很了解。網上找到一個換算/計算公式供參考:

據px = dip * density / 160,則當屏幕密度為160時,px = dip
根據 google 的建議,TextView 的字型大小最好使用 sp 做單位,而且查看TextView的源碼可知Android默認使用sp作為字型大小單位。將dip作為其他元素的單位。
url:http://greatverve.cnblogs.com/archive/2011/12/27/Android-dip-dp-sp-pt-px.html


推薦一張Android UI設計參考圖


一、度量單位的定義

1、dip: device independent pixels(設備獨立像素). 不同設備有不同的顯示效果,這個和設備硬體有關,一般我們為了支持WVGA(800*480)、HVGA和QVGA 推薦使用這個,不依賴像素。

dp是開發寫layout的時候使用的尺寸單位,sp是開發寫layout時關於字體的字型大小單位。

2、解析度是屏幕圖像的精密度,是指顯示器所能顯示的像素點的多少。由於屏幕上的點、線和面都是由像素組成的,顯示器可顯示的像素越多,畫面就越精細,同樣的屏幕區域內能顯示的信息也越多,所以解析度是個非常重要的性能指標之一。

3、px: pixels(像素). 不同設備顯示效果相同,一般我們HVGA代表320x480像素,這個用的比較多。px是解析度的單位,也就是說320x480的解析度內,共有153600px個像素。

4、屏幕密度:表示每英寸有多少個顯示點,與解析度是兩個不同的概念。單位是dpi(dot per inch)。

dpi的計算:dpi=Diagonal pixel/ Screen size

Diagonal
pixel表示對角線的像素值


比如:計算WVGA(800*480)解析度,3.7英寸

DPI=sqrt{800^{2} +480^{2 }}
=933/3.7=252

Android主要有以下幾種屏:如下表


二、視覺與客戶端之間的溝通

1、例如,視覺給出的視覺稿標註的就是12 dp,這樣客戶端開發就不需要換算,可以直接使用12 dp。每一台移動設備都會自動根據屏幕尺寸調整間距,字體大小,來保證這個間距是12 dp。

2、當視覺給出的視覺稿標註的是像素時,需要客戶端的開發先計算出相應的dp,具體的計算公式為:px
= dip * (density / 160),然後使用計算出的dp,移動設備會自動適配。

同時也就是說,當屏幕密度為160時,px = dip。

確定的dp,就是不同的設備,間距的像素值可能會不同,但是dp一定相同。

3、例如解析度為320 x480時,屏幕尺寸為3.0—3.5時,屏幕密度為Medium,默認值為160,由公式得px=dp;當解析度為480 x800時,屏幕尺寸為3.3—4.0時,屏幕密度為high默認值為240,由公式的px=1.5dp,字型大小(在系統中選擇普通字型大小)是視覺給字型大小大小的1.5倍,px=1.5sp。


dip: device independent pixels(設備獨立像素). 不同設備有不同的顯示效果,這個和設備硬體有關,一般我們為了支持WVGA、HVGA和QVGA 推薦使用這個,不依賴像素。
px: pixels(像素). 不同設備顯示效果相同,一般我們HVGA代表320x480像素,這個用的比較多。
pt: point,是一個標準的長度單位,1pt=1/72英寸,用於印刷業,非常簡單易用;
sp: scaled pixels(放大像素). 主要用於字體顯示best for textsize。
由此,根據 google 的建議,TextView 的字型大小最好使用 sp 做單位,而且查看
TextView
的源碼可知 Android 默認使用 sp 作為字型大小單位。
在 Android 中, 1pt 大概等於 2.22sp
以上供參考,如果 UI 能夠以 sp 為單位提供設計是最好的,如果設計中沒有 sp
的概念,則開發人員也可以通過適當的換算取近似值。
過去,程序員通常以像素為單位設計計算機用戶界面。例如,定義一個寬度為300像素的表單欄位,列之間的間距為5個像素,圖標大小為16×16像素 等。這樣處理的問題在於,


如果在一個每英寸點數(dpi)更高的新顯示器上運行該程序,則用戶界面會顯得很小。在有些情況下,用戶界面可能會小到難以看清 內容。
與解析度無關的度量單位可以解決這一問題。Android支持下列所有單位。
px(像素):屏幕上的點。
in(英寸):長度單位。
mm(毫米):長度單位。
pt(磅):1/72英寸。
dp(與密度無關的像素):一種基於屏幕密度的抽象單位。在每英寸160點的顯示器上,1dp = 1px。
dip:與dp相同,多用於android/ophone示例中。
sp(與刻度無關的像素):與dp類似,但是可以根據用戶的字體大小首選項進行縮放。


為了使用戶界面能夠在現在和將來的顯示器類型上正常顯示,建議大家始終使用sp作為文字大小的單位,將dip作為其他元素的單位。當然,也可以考慮使用矢量圖形,而不是用點陣圖


PM關於設計那些事兒(一)

這篇文章里說的還是比較清楚


這個解答或許對這幾個的理解有幫助八一八那些px、pt、ppi、dpi、dp、sp之間的關係-Snow


對常見的單位補充幾點:

  • dip = dp
  • 一般而言 sp = dp。注意sp會Android設置里的字體大小而變化,但dp不會。見 android.util.TypedValue#applyDimension
  • 1in = 2.54cm = 25.4mm = 72pt 這些是物理長度,可以用尺子從屏幕上量出來。注意pt是「磅」不是「點」

推薦閱讀:

TAG:Adobe Photoshop | 圖形用戶界面 | 平面設計 | 用戶界面設計 |