作者:範曉偉
dip:device independentpixels,裝置獨立像素,一個基於density的抽象單位:
不同裝置不同的顯示效果,這個和裝置硬體有關,一般我們為了支援WVGA、HVGA和QVGA 推薦使用這個,不依賴像素。
在android上開發的程式將會在不同解析度的手機上運行。為了讓程式外觀不至於相差太大,所以引入了dip的概念。比如定義一個矩形10 x 10dip.在解析度為160dpi的屏上,比如G1,正好是10 x 10像素。而在240 dpi的屏,則是15 x 15像素.換算公式為pixs = dips * (density/160). density就是屏的解析度。
這裡要特別注意dip與螢幕密度有關,而螢幕密度又與具體的硬體有關,硬體設定不正確,有可能導致dip不能正常顯示。在螢幕密度為160的顯示屏上,1dip=1px,有時候可能你的螢幕解析度很大如480*800,但是螢幕密度沒有正確設定比如說還是160,那麼這個時候凡是使用dip的都會顯示異常,基本都是顯示過小。
dp:與密度無關的像素:
同dip是一樣的。 一種基於螢幕密度的抽象單位。在每英寸160點的顯示器上,1dp =1px。
px:pixels,像素:
螢幕上的點,不同裝置不同的顯示屏顯示效果相同,這是絕對像素,是多少就永遠是多少不會改變。
sp :scaled pixels — bestfor text size,放大像素,與刻度無關的像素:
主要處理字型的大小,與dp類似,但是可以根據使用者的字型大小喜好設定進行縮放,主要用於字型顯示best for text size。
過去,程式員通常以像素為單位設計電腦使用者介面。例如,定義一個寬度為300像素的表單欄位,列之間的間距為5個像素,表徵圖大小為16×16像素等。這樣處理的問題在於,如果在一個DPI(dpi)更高的新顯示器上運行該程式,則使用者介面會顯得很小。在有些情況下,使用者介面可能會小到難以看清內容。
由此,根據 google 的建議,TextView 的字型大小最好使用 sp 做單位,而且查看TextView的源碼可知 Android預設使用 sp 作為字型大小單位。
根據google的推薦,像素統一使用dip,字型統一使用sp。
針對dip和px 的關係,做以下概述:
QVGA屏density=120 QVGA(240*320)
HVGA屏density=160 HVGA(320*480)
WVGA屏density=240 WVGA(480*800)
WQVGA屏density=120 WQVGA(240*400)
density值表示每英寸有多少個顯示點,與解析度是兩個概念。
不同density下螢幕解析度資訊,以480dip*800dip的 WVGA(density=240)為例:
density=120時
螢幕實際解析度為240px*400px(兩個點對應一個解析度)
狀態列和標題列高各19px或者25dip
橫屏是螢幕寬度400px 或者800dip,工作區域高度211px或者480dip
豎屏時螢幕寬度240px或者480dip,工作區域高度381px或者775dip
density=160時
螢幕實際解析度為320px*533px(3個點對應兩個解析度)
狀態列和標題列高個25px或者25dip
橫屏是螢幕寬度533px 或者800dip,工作區域高度295px或者480dip
豎屏時螢幕寬度320px或者480dip,工作區域高度508px或者775dip
density=240時
螢幕實際解析度為480px*800px(一個點對於一個解析度)
狀態列和標題列高個38px或者25dip
橫屏是螢幕寬度800px 或者800dip,工作區域高度442px或者480dip
豎屏時螢幕寬度480px或者480dip,工作區域高度762px或者775dip
apk的資源套件中
當螢幕density=240時,使用hdpi 標籤的資源
當螢幕density=160時,使用mdpi標籤的資源
當螢幕density=120時,使用ldpi標籤的資源。
不加任何標籤的資源是各種解析度情況下共用的。
布局時盡量使用單位dip,少使用px。
dp與px換算公式:
pixs=dips * (densityDpi/160)
dips=(pixs*160)/densityDpi
dp與px轉換的方法:
public static int dipToPx(Contextcontext, float dipValue)
{
final float scale =context.getResources().getDisplayMetrics().density;
return (int) (dipValue * scale+ 0.5f);
}
public static int pxToDip(Contextcontext, float pxValue)
{
final float scale =context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale+ 0.5f);
}
為了使使用者介面能夠在現在和將來的顯示器類型上正常顯示,建議大家始終使用sp作為文字大小的單位,將dip作為其他元素的單位。當然,也可以考慮使用向量圖形,而不是用位元影像。如果
UI 能夠以sp為單位提供設計是最好的,如果設計中沒有sp的概念,則開發人員也可以通過適當的換算取近似值。
與解析度無關的度量單位可以解決這一問題。Android支援下列所有單位。
不經常用的其他單位:
pt:point,磅,是一個標準的長度單位,1pt=1/72英寸,用於印刷業,非常簡單易用;在 Android 中,1pt 大概等於 2.22sp。
in:inches,英寸:長度單位。
Mm:millimeters,毫米:長度單位。