Android dp 和 px 互換 (dp px exchange)

Image from BBC GEL

在 Android 中如何將 dp 和 px 兩個單位互換?

單位

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://blog.tonycube.com/2013/07/android-dp-px-dp-px-exchange.html
Tony Blog 撰寫,轉載時請註明出處及文章連結,謝謝 😀

2 則留言

  1. Tony老師你好
    想請問一下
    pixels = dp * (density / 160)
    那如果我今天用一台5吋的手機 1920x1080 pixels
    我要怎麼知道我該用哪台模擬器呢?
    沒辦法知道手機的density
    這樣不是就對不到嗎

    回覆刪除
    回覆
    1. 模擬器是看解析度,選1920x1080 pixels的,
      圖片放在不同的資料夾(drawable-mdpi, -hdpi, -xhdpi),由系統判斷選擇顯示哪一個資料夾中的圖片,不用去知道density。

      刪除

留言小提醒:
1.回覆時間通常在晚上,如果太忙可能要等幾天。
2.請先瀏覽一下其他人的留言,也許有人問過同樣的問題。
3.程式碼請先將它編碼後再貼上。(線上編碼:http://bit.ly/1DL6yog)
4.文字請加上標點符號及斷行,難以閱讀者恕難回覆。
5.感謝您的留言,您的問題也可能幫助到其他有相同問題的人。