天天看点

安卓屏幕适配必须了解的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
           

继续阅读