- Android布局檔案中常用的長度機關解析(http://www.2cto.com/kf/201208/148252.html)
- 2012-08-15 0 個評論
- 收藏 我要投稿
-
Android 顯示機關
dip: device independent pixels(裝置獨立像素). 不同裝置有不同的顯示效果,這個和裝置硬體有關,一般我們為了支援WVGA、HVGA和QVGA cwj推薦使用這個,不依賴像素。
px: pixels(像素). 不同裝置顯示效果相同,一般我們HVGA代表320x480像素,這個用的比較多。
pt: point,是一個标準的長度機關,1pt=1/72英寸,用于印刷業,非常簡單易用;
sp: scaled pixels(放大像素). 主要用于字型顯示best for textsize。
由此,根據 google 的建議,TextView 的字号最好使用 sp 做機關,而且檢視
TextView的源碼可知 Android 預設使用 sp 作為字号機關。
###################################################################
關于換算(以 sp 和 pt 為例)
檢視 TextView 等類的源碼,可知:
case COMPLEX_UNIT_PX:
return value;
case COMPLEX_UNIT_SP:
return value * metrics.scaledDensity;
case COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f/72);
--------------------------
scaledDensity = DENSITY_DEVICE / (float) DENSITY_DEFAULT;
xdpi = DENSITY_DEVICE;
--------------------------
DENSITY_DEFAULT = DENSITY_MEDIUM = 160;
============================================
是以: 假設 pt 和 sp 取相同的值 1,則可設 1pt 和 1sp 之間系數為 x,
1 * DENSITY_DEVICE / 72 = x * 1 * DENSITY_DEVICE / 160 =>
x = 160 / 72 = 2.2222
也就是說在 Android 中, 1pt 大概等于 2.22sp
以上供參考,如果 UI 能夠以 sp 為機關提供設計是最好的,如果設計中沒有 sp
的概念,則開發人員也可以通過适當的換算取近似值。
什麼是Dip和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作為其他元素的機關。當然,也可以考慮使用矢量圖形,而不是用位圖
說說dp和sp,dp也就是dip。這個和sp基本類似。如果設定表示長度、高度等屬性時可以使用dp或sp。但如果設定字型,需使用sp。dp是與密度無關,sp除與密度無關外,還與scale無關。如果螢幕密度為160,這時dp和sp和px是一樣的。1dp=1sp=1px,但如果使用px作機關,如果螢幕大小不變(假設還是3.2寸),而螢幕密度變成了320。那麼原來TextView的寬度設成160px,在密度為320的3.2寸螢幕裡看要比在密度為160的3.2寸螢幕上看短了一半。但如果設定成160dp或160sp的話。系統會自動将width屬性值設定成320px。也就是160 * 320 / 160。其中320 / 160可稱為密度比例因子。也就是說,如果使用dp和sp,系統會根據螢幕密度的變化自動進行轉換。