Android中dip(dp)、dpi、ppi、px、density、sp的概念

HFW發表於2019-05-10

前言

dp這個單位在Android中使用非常頻繁,如果需要指定一個View的大小時,除了使用wrap_content、match_parnet以外,一般會通過dp進行指定,但是當在佈局檔案中指定android:layout_width="10dp"時,其在手機上到底會顯示多大物理寬度? 要解決這個問題得先從dip(dp)、dpi、ppi、px、density、sp這些的概念說起。

概念

  • dp(density-independent pixels) 密度無關畫素
  • dpi(Dots Per Inch) 每英寸點總數
  • ppi(Pixels Per Inch) 每英寸長度內的畫素總數
  • px(Pixels) 畫素
  • density 密度
  • sp 縮放無關畫素,基本和dp一致,其會根據使用者字型縮放進行適應,設定字型大小時使用

換算

Tips: screenInch 螢幕英寸,widthPixel 螢幕寬畫素數量,heightPixel 螢幕高畫素數,sqrt平方根運算

  • dpi = ppi = sqrt(widthPixel * widthPixel + heightPixel * heightPixel) / screenInch
  • density = dpi / 160
  • 1dp = 1sp = density(px)
  • 1px = 1 / density(dp)

綜合上述各式我們可以得出1dp物理長度 = 2.54/160(cm),那麼文章一開始的問題就迎刃而解了,10dp理論上會顯示25.4/160(cm),為什麼說是理論上呢?因為android上的dpi計算並不準確,比如通過上述公式計算出1080 * 2280 解析度 5.84 英寸螢幕的dpi為432,但是在程式中通過getResource().getDisplayMetrics().densityDpi拿到的居然是480。

1dp物理長度 = density * 每個畫素的長度 = density * 2.54 / dpi = dpi / 160 * 2.54 / dpi = 2.54 / 160(cm)

相關文章