天天看點

安卓螢幕适配必須了解的px ppi dpi density dip dp

概念

  • px

    英文叫pixel,就是像素的意思。比如我的一加七分辨率是1080*2340,就是寬度有1080個像素點。
  • ppi

    英文叫 pixels pe inch,就是每英寸有多少個像素。比如一加七手機預設是420像素/英寸。根據定義可以知道,同一個螢幕,同一個分辨率,這個值是固定的。
  • dpi

    英文叫 dots per inch,就是每英寸有多少個點,這個應該是曆史遺留的說法,以前的列印機就是以點來算的,現在的螢幕是已像素算的,是以這個和 ppi 其實是一樣的東西。常見的數值有160像素/英寸,240像素/英寸,一加七是420像素/英寸。
  • density

    密度,谷歌規定,一塊160像素/英寸的螢幕,密度就是1。那麼320像素/英寸,密度就是2。也就是說:密度 = dpi / 160像素/英寸。
  • dip

    英文叫 density independent pixels,大概就是一個抽象的像素,像素是一個具體的不會變的東西,但是dip會根據螢幕的像素密度變化。
  • dp

    就是dip。當dpi=160像素/英寸,則1dp=1px。當dpi=320像素/英寸,則1dp=2px。是以,[x]dp=[x*density]px,[x]px=[x/density]dp。

換算

主要就是

dp

px

的換算,因為一般來說設計給的設計稿都是以px為機關的,但是我們寫界面的時候用的但是是dp。上面已經得出公式了:

  • [x]dp=[x*density]px
  • [x]px=[x/density]dp
fun dp2px(context: Context, dp: Int): Int {
    return (dp * context.resources.displayMetrics.density).toInt()
}

fun px2dp(context: Context, px: Int): Int {
    return (px / context.resources.displayMetrics.density).toInt()
}
           

DisplayMetrics

// 一加七的資料
val metrics = DisplayMetrics()
windowManager.defaultDisplay.getMetrics(metrics)
LogUtils.e("hello", metrics.density)// 2.625
LogUtils.e("hello", metrics.densityDpi)// 420,也就是dpi
LogUtils.e("hello", metrics.widthPixels)// 1080
LogUtils.e("hello", metrics.heightPixels)// 2260,這裡的值是除掉狀态欄高度80了,螢幕實際搞定是2340。
LogUtils.e("hello", metrics.scaledDensity)// 2.625,預設就是density,除非使用者手動改過
LogUtils.e("hello", metrics.xdpi)// 403.411
LogUtils.e("hello", metrics.ydpi)// 409.903
           

繼續閱讀