px dp和sp,這些單位有什麼區別?

2021-09-10 16:23:57 字數 2909 閱讀 3569

dp

這個是最常用但也最難理解的尺寸單位。它與「畫素密度」密切相關,所以

首先我們解釋一下什麼是畫素密度。假設有一部手機,螢幕的物理尺寸為1.5英吋x2英吋,螢幕解析度為240x320,則我們可以計算出在這部手機的螢幕上,

每英吋包含的畫素點的數量為240/1.5=160dpi(橫向)或320/2=160dpi(縱向),160dpi就是這部手機的畫素密度,畫素密度的單位dpi是dots per inch的縮寫,即每英吋畫素數量。

橫向和縱向的這個值都是相同的,原因是大部分手機螢幕使用正方形的畫素點。

不同的手機/平板可能具有不同的畫素密度,例如同為4寸手機,有480x320解析度的也有800x480解析度的,前者的畫素密度就比較低。

android系統定義了四種畫素密度:低(120dpi)、中(160dpi)、高(240dpi)和超高(320dpi),它們對應的dp到px的係數分別為0.75、1、1.5和2,這個係數乘以dp長度就是畫素數。

例如介面上有乙個長度為「80dp」的,那麼它在240dpi的手機上實際顯示為80x1.5=120px,在320dpi的手機上實際顯示為80x2=160px。

如果你拿這兩部手機放在一起對比,會發現這個的物理尺寸「差不多」,這就是使用dp作為單位的效果

即畫素,1px代表螢幕上乙個物理的畫素點;

px單位不被建議使用,因為同樣100px的,在不同手機上顯示的實際大小可能不同,如下圖所示

density independent pixels ,裝置無關畫素。

與dp完全相同,只是名字不同而已。在早期的android版本裡多使用dip,後來為了與sp統一就建議使用dp這個名字了。

比如乙個機器,螢幕4寸,解析度480x800,他的dpi能算麼。

因為不知道邊長,肯定不能分開算,4是對角線長度,那直接用勾股定理算對角線畫素,除以4,算出來大概是 dpi = 233 畫素/英吋。

那麼density就是 (233 px/inch)/(160 px/inch)=1.46 左右

順帶說下,android預設的只有3個dpi,low、medium和high,對應 120、160、240,如果沒有特別設定,所有的dpi都會被算成這3個,具體可以參考下這個帖子

其中的default就是160。

與縮放無關的抽象畫素(scale-independent pixel)。

sp和dp很類似但唯一的區別是,android系統允許使用者自定義文字尺寸大小(小、正常、大、超大等等),當文字尺寸是「正常」時1sp=1dp=0.00625英吋,而當文字尺寸是「大」或「超大」時,1sp>1dp=0.00625英吋。

類似我們在windows裡調整字型尺寸以後的效果——視窗大小不變,只有文字大小改變。

最佳實踐,文字的尺寸一律用sp單位,非文字的尺寸一律使用dp單位

例如textsize="16sp"、layout_width="60dp";偶爾需要使用px單位,例如需要在螢幕上畫一條細的分隔線

我們寫布局的時候,肯定還是要知道1個dp到底有多少px的。

換算公式如下: dp = (dpi/(160畫素/英吋))px = density px

注意,這裡都是帶單位的。px是單位,dp是單位,density沒單位。

為了方便,假設dpi是240 畫素/英吋 , 那麼density就是1.5

那麼就是 dp=1.5px ,注意這是帶了單位的,也就是 裝置無關畫素 = density 畫素

那麼轉換為數值計算的話,應該是下面這個式子

px = density * dp

也就是 

畫素值 = density * 裝置無關畫素值 ,請注意這裡有個值字。

(1)android design [1] 裡把主流裝置的 dpi 歸成了四個檔次,120 dpi、160 dpi、240 dpi、320 dpi

實際開發當中,我們經常需要對這幾個尺寸進行相互轉換(比如先在某個解析度下完成設計,然後縮放到其他尺寸微調後輸出),一般按照 dpi 之間的比例即 2:1.5:1:0.75   來給介面中的元素來進行尺寸定義。

也就是說如果以 160 dpi 作為基準的話,只要尺寸的 dp 是 4 的公倍數,xhdpi 下乘以 2,hdpi 下乘以 1.5,ldpi 下乘以 0.75 即可滿足所有尺寸下都是整數 pixel 。

但假設以 240 dpi 作為標準,那需要 dp 是 3 的公倍數,xhdpi 下乘以 1.333,mdpi 下乘以 0.666 ,ldpi 下除以 2

而以 ldpi 和 xhdpi 為基準就更複雜了,所以選擇 160 dpi

(2)這個在google的官方文件中有給出了解釋,因為第一款android裝置(htc的t-mobile g1)是屬於160dpi的。

是因為這個世界上存在著很多不同螢幕密度的手機,螢幕密度是什麼?就是dpi,就是單位長度裡的畫素數量。

想象一下,如果這些手機的尺寸一樣,螢幕密度相差很大,那麼是不是說乙個手機水平方向上畫素很少,另乙個手機水平方向上畫素很多?那我們畫同樣pix數量的時候,它顯

示的長度不就會不一樣了?

比如下面圖中的兩個手機,同時設定2px長度的button,在螢幕密度較高的手機裡就會顯示的比較小。

而同時設定的2dip長度的button,在兩個手機上顯示的大小是一樣的。

來看一下emulator上的效果,我定義了兩個button,分別用px和dip做單位。

布局檔案裡這樣寫

px dp和sp,這些單位有什麼區別?

即畫素,1px代表螢幕上乙個物理的畫素點 px單位不被建議使用,因為同樣100px的,在不同手機上顯示的實際大小可能不同,如下圖所示。這個是最常用但也最難理解的尺寸單位。它與 畫素密度 密切相關,所以首先我們解釋一下什麼是畫素密度。假設有一部手機,螢幕的物理尺寸為1.5英吋x2英吋,螢幕解析度為24...

px dp和sp,這些單位有什麼區別?

相信每個android新手都會遇到這個問題,希望這篇帖子能讓你不再糾結。即畫素,1px代表螢幕上乙個物理的畫素點 px單位不被建議使用,因為同樣100px的,在不同手機上顯示的實際大小可能不同,如下圖所示。這個是最常用但也最難理解的尺寸單位。它與 畫素密度 密切相關,所以首先我們解釋一下什麼是畫素密...

px dp和sp,這些單位有什麼區別?

相信每個android新手都會遇到這個問題,希望這篇帖子能讓你不再糾結。即畫素,1px代表螢幕上乙個物理的畫素點 px單位不被建議使用,因為同樣100px的,在不同手機上顯示的實際大小可能不同,如下圖所示。這個是最常用但也最難理解的尺寸單位。它與 畫素密度 密切相關,所以首先我們解釋一下什麼是畫素密...