單位
dp : Density-independent pixel,獨立於螢幕解析度密度的像素值,也就是說,當你設定 1dp 時,在 120 dpi 的螢幕上會是原本的 75 %,在 160 dpi 的螢幕上為 100%,在 240 dpi 的螢幕上為 150%,實際的像素值會依螢幕密度而改變。px : pixel ,一般所認知的像素值,指定多少就是多少,不會因螢幕密度不同而改變。所以 100 * 100 px 的方形在 320 x 480 螢幕的手機上看起來會比 1280 x 720 的螢幕上看起來大很多,這個方形實際上尺寸並沒有改變,改變的是螢幕解析度,放在一個較小的空間看起來比較大,放在一個較大的空間,看起來就會比較小。
這裡有圖示解說,看圖比較容易懂。
轉換
如果單純只在 layout 上指定值,直接指定 dp 就好了,但如果要在程式碼中指定就必須要做轉換,否則都是 px ,我們必須把它轉為 dp 才能和其他在 layout 中指定的元件有一樣的比例。我自己是找到公式後寫成工具程式,直接叫用就好了,程式碼如下:
/**
* Covert dp to px
* @param dp
* @param context
* @return pixel
*/
public static float convertDpToPixel(float dp, Context context){
float px = dp * getDensity(context);
return px;
}
/**
* Covert px to dp
* @param px
* @param context
* @return dp
*/
public static float convertPixelToDp(float px, Context context){
float dp = px / getDensity(context);
return dp;
}
/**
* 取得螢幕密度
* 120dpi = 0.75
* 160dpi = 1 (default)
* 240dpi = 1.5
* @param context
* @return
*/
public static float getDensity(Context context){
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
return metrics.density;
}
參考資料
http://developer.android.com/guide/practices/screens_support.htmlhttp://www.bbc.co.uk/gel/tablet/tablet-device-considerations/pixel-density
沒有留言:
張貼留言