咱們在頁面佈局的時候,常常會設置容器的長度,可是到底該使用哪一個做爲長度的單位而懊惱。在Android中支持的描述大小區域的類型有如下幾種:
px(pixels)——像素:不一樣的設備顯示效果相同,通常咱們HVGA表明320x480像素,這個用的比較多。
dip(device independent pixels)——設備獨立像素:這個和設備硬件有關,通常咱們爲了支持WCGA、HVGA和QVGA推薦使用這個,不依賴於像素。等同於dp。
sp(scaled pixels—best for text size)——主要用於字體顯示best for textsize。由此,根據 google 的建議,TextView 的字號最好使用 sp 作單位,並且查看TextView的源碼可知 Android 默認使用 sp 做爲字號單位。
pt(points)——磅:是一個標準的長度單位,1pt=1/72英寸,用於印刷業,很是簡單易用;
在 Android 中,1pt 大概等於2.22sp以上供參考,若是 UI 可以以sp爲單位提供設計是最好的,若是設計中沒有sp的概念,則開發人員也能夠經過適當的換算取近似值。
in(inches)——英寸
mm(millimeters)——毫米
過去,程序員一般以像素爲單位設計計算機用戶界面。例如,定義一個寬度爲300像素的表單字段,列之間的間距爲5個像素,圖標大小爲16×16像素 等。這樣處理的問題在於,若是在一個每英寸點數(dpi)更高的新顯示器上運行該程序,則用戶界面會顯得很小。在有些狀況下,用戶界面可能會小到難以看清內容。
到底px和dip有什麼區別呢?java
dip != px
主要是針對不一樣設備而言的。在Density是160的設備上,好比用AVDManager建立的默認模擬器,dip和px是同樣的可是若是一樣的代碼,換到不一樣Density的設備上,好比換到一個Density是240的設備上,dip和px體現出來的大小就不同了。px無論在什麼樣的設備上都是那樣長,可是dip會根據設備變化;WQVGA屏density=120;QVGA屏density=120;HVGA屏density=160;WVGA屏density=240;density值表示每英寸有多少個顯示點,與分辨率是兩個概念。
當屏幕density=240時使用hdpi標籤的資源
當屏幕density=160時使用mdpi標籤的資源
當屏幕density=120時使用ldpi標籤的資源。
不加任何標籤的資源是各類分辨率狀況下共用的。爲了使用戶界面可以在如今和未來的顯示器類型上正常顯示,建議你們始終使用sp做爲文字大小的單位,將dip做爲其餘元素的單位。固然,也能夠考慮使用矢量圖形,而不是用位圖。。
px和dp換算公式爲:
pixs =dips * (densityDpi/160).
dips=(pixs*160)/densityDpi
如何得到設備的屏幕分辨率和屏幕密度?
例如分辨率爲480*800,密度爲240的設備,方法以下:android
DisplayMetrics dm =getResources().getDisplayMetrics(); dm.densityDpi=240 dm.widthPixels=480 dm.heightPixels=800
轉換代碼程序員
import android.content.Context; public class DensityUtil { /** * 根據手機的分辨率從 dp 的單位 轉成爲 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); } }