安卓屏幕适配必须了解的px ppi dpi density dip dp

mac2024-11-19  4

概念

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
最新回复(0)