簡述Android單位dp、sp、dip、px、等的區別和使用
廢話就不多說了,直接說重點。首先解釋下這幾個單位的代表意思。
由於過去通常以畫素為單位設計計算機使用者介面。當一個畫素在80x80的時候,在高解析度顯示器上執行該程式,則使用者介面會顯得很小。所以採用與解析度無關的度量單位來開發程式就能夠解決這個問題。而Android應用開發支援不同的度量單位。
一.解釋下:
dip: device independent pixels(裝置獨立畫素). 不同裝置有不同的顯示效果,這個和裝置硬體有關,一般我們為了支援 WVGA、HVGA和QVGA 推薦使用這個,不依賴畫素。
dp: dip是一樣的
px: pixels(畫素). 不同裝置顯示效果相同,一般我們HVGA代表320x480畫素,這個用的比較多。
pt: point,是一個標準的長度單位,1pt=1/72英寸=0.035釐米,用於印刷業,非常簡單易用;
sp: scaled pixels(放大畫素). 主要用於字型顯示best for textsize。
in(英寸):長度單位。 1英寸=2.54釐米(約);
mm(毫米):長度單位。
當然我們光是瞭解不會用那就不行了。
二.度量單位的換算公式
在android原始碼包TypedValue.java中,我們看如下函式:
public static float applyDimension(int unit, float value, DisplayMetrics metrics) {
switch (unit) {
case COMPLEX_UNIT_PX:
return value;
case COMPLEX_UNIT_DIP:
return value * metrics.density;
case COMPLEX_UNIT_SP:
return value * metrics.scaledDensity;
case COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f/72);
case COMPLEX_UNIT_IN:
return value * metrics.xdpi;
case COMPLEX_UNIT_MM:
return value * metrics.xdpi * (1.0f/25.4f);
}
return 0;
}
該函式功能:是把各單位換算為畫素。
metrics.density:預設值為DENSITY_DEVICE / (float) DENSITY_DEFAULT;
metrics.scaledDensity:預設值為DENSITY_DEVICE / (float) DENSITY_DEFAULT;
metrics.xdpi:預設值為DENSITY_DEVICE;
DENSITY_DEVICE:為螢幕密度
DENSITY_DEFAULT:預設值為160
然後我們還得了解Android有哪些屏:如下表
螢幕 Tyep |
寬度 Pixels |
高度 Pixels |
尺寸 Range(inches) |
螢幕密度 |
QVGA |
240 |
320 |
2.6-3.0 |
low |
WQVGA |
240 |
400 |
3.2-3.5 |
low |
FWQVGA |
240 |
432 |
3.5-3.8 |
low |
HVGA |
320 |
480 |
3.0-3.5 |
Medium |
WVGA |
480 |
800 |
3.3-4.0 |
High |
FWVGA |
480 |
854 |
3.5-4.0 |
High |
WVGA |
480 |
800 |
4.8-5.5 |
Medium |
FWVGA |
480 |
854 |
5.0-5.8 |
Medium |
備註 |
目前android預設的low=120 ;Medium =160; High = 240 |
px就是畫素的意思:1px代表螢幕上一個物理的畫素點;所以用畫素相當於實際畫素畫。那麼100px的圖片不同的手機上就會出現大小不一樣。就向100長度的線在200螢幕寬上顯示的就是一半,而在300螢幕上就只佔用了1/3。
dip與dp完全相同,只是名字不同而已。在早期的Android版本里多使用dip,後來為了與sp統一就建議使用dp這個名字了。這裡就細細解釋下dp:它與“畫素密度”密切相關,所以首先我們解釋一下什麼是畫素密度?
畫素密度:假設手機螢幕解析度為240x320,螢幕的物理尺寸為1.5英寸x2英寸,(1英寸(in)=2.54釐米(cm)),那麼每英寸包含的畫素點的數量為240/1.5=160dpi(寬)或320/2=160dpi(高),160dpi就是這部手機的畫素密度。
剛才表中已經說明了Android手機分(low=120 ;Medium =160; High = 240,VeryHigh=320)低,中,高,超高四等密度,而他們對應的dp到px的係數分別為0.75、1、1.5和2,這個係數乘以dp長度就是畫素數。
最後:在大小螢幕相同,解析度不一樣時候(480x320解析度或者800x480),假設一個80dp長度的圖片,換算成240dpi的手機上實際顯示為80x1.5=120px,在320dpi的手機上實際顯示為80x2=160px,這樣使用dp就感覺差別不是很大了。
sp:
與縮放無關的抽象畫素(Scale-independent Pixel)。sp和dp很類似但唯一的區別是,Android系統允許使用者自定義文字尺寸大小(小、正常、大、超大等等),當文字尺寸是“正常”時1sp=1dp=0.00625英寸,而當文字尺寸是“大”或“超大”時,1sp>1dp=0.00625英寸。類似我們在windows裡調整字型尺寸以後的效果——視窗大小不變,只有文字大小改變。
使用建議,文字的尺寸一律用sp單位,非文字的尺寸一律使用dp單位。例如textSize="16sp"、layout_width="60dp";偶爾需要使用px單位,例如需要在螢幕上畫一條細的分隔線時:
歡迎各位留言指點。