前言
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)