當我們在Android Studio或者Eclipse中編輯布局的時候,開發工具會提示我們使用dp、sp、px、in、pt、mm這六種單位。那么這六種單位各自代表什么含義,需要在什么地方使用呢?
六種單位介紹
- px : 像素(pixels),即屏幕上的像素點,1px代表占據一個像素點。
- dp : 獨立像素(device independent pixels),這是我們使用最多的一種單位,一般來說我們在布局文件中定義控件的寬高等屬性時都會使用它。它是一種能夠自動適應不同屏幕密度的單位,在160dpi的屏幕上,1dp = 1px。由于Android碎片化嚴重,使用它作為長度單位可以適配不同的屏幕密度。
- sp : 比例像素(scaled pixels),我們定義字體大小的時候,一般都會使用sp作單位。sp除了能夠像dp一樣可以適應屏幕密度的變化,還可以隨著系統字體的大小設置改變作出變化。如果產品經理不想文字隨著手機設置中字體的大小發生改變(例如標題),可以使用dp代替。
- in : 英寸(inch),屏幕的物理尺寸,1 inch = 2.54cm。
- pt : 點(point,也是屏幕的物理尺寸,1 pt = 1/72 inch。
- mm : 毫米(millimeter),后面三種都是物理尺寸,在Android開發中不常用。
dp和px的換算
-
1px = 1dp * (density / 160)
dp和px的換算關系如上公式所示,density代表當前屏幕密度。常見的手機屏幕像素及對應分別率級別如下表所示:
級別 | 分辨率 | dpi大小 | dp:dx |
---|---|---|---|
ldpi | 320*240 | 120dpi | 0.75 |
mdpi | 480*320 | 160dpi | 1 |
hdpi | 800*480 | 240dpi | 1.5 |
xdpi | 1280*720 | 320dpi | 2 |
xxdpi | 1920*1080 | 120dpi | 3 |
- dpi表示屏幕像素密度,代表每平方英寸的像素數量。
在代碼中轉換單位
textView.setTextSize(2,14);
代碼中設置的屬性單位默認是px,我們需要對其作適當的轉換。例如,上面的代碼中,給TextView設置文字大小。第一個參數代表單位,這里的2代表sp,第二個參數代表大小。具體的單位指代可以在源碼中看到。
public class DensityUtil {
/**
* 根據手機的分辨率從 dip 的單位 轉成為 px(像素)
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* 根據手機的分辨率從 px(像素) 的單位 轉成為 dp
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
}
我們也可以封裝一個上面代碼中的工具類,在代碼中使用長度時先使用工具類進行轉換。
總結
一般來說,我們在android開發中為了適配不同像素密度的屏幕,要避免使用px作單位。如果UI妹子給的效果圖用的px作單位,我們要轉換未dp,具體的公式在上面有。在設置文字大小時使用sp,除非不想文字隨著系統字體設置變化大小。在代碼中設置的長度單位默認是px,需要轉換為dp或者sp。