安卓屏幕適配必須瞭解的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。

換算

主要就是 dppx 的換算,因爲一般來說設計給的設計稿都是以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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章