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

前言

dp這個單位在Android中使用很是頻繁,若是須要指定一個View的大小時,除了使用wrap_content、match_parnet之外,通常會經過dp進行指定,可是當在佈局文件中指定android:layout_width="10dp"時,其在手機上到底會顯示多大物理寬度? 要解決這個問題得先從dip(dp)、dpi、ppi、px、density、sp這些的概念提及。android

概念

  • 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)code

相關文章
相關標籤/搜索