DisplayMetrics信息获取:
//Display屏幕显示的详细信息
Display display = getWindowManager().getDefaultDisplay();
//从Display获取DisplayMetrics信息
DisplayMetrics metrics = new DisplayMetrics();
display.getMetrics(metrics);
//上面获取的DisplayMetrics只可读,
//第二种获取DisplayMetrics的方式,可修改里面的参数
context.getResources().getDisplayMetrics()
实际屏幕的DisplayMetrics信息
机型 | 屏幕尺寸 | widthPixels | heightPixels | density | densityDpi | scaledDensity | xdpi | ydpi |
---|---|---|---|---|---|---|---|---|
小米4C | 4.9英寸 | 1080 | 1920 | 3.0 | 480 | 3.0 | 449.704 | 447.412 |
小米mix2 | 5.99英寸 | 1080 | 2160 | 2.75 | 440 | 2.75 | 403.411 | 403.411 |
首先160dpi是google定义的一个密度标准,dpi就是dots_per_inch,
- widthPixels:宽度 显示的数值是1080,就是说屏幕的宽度是1080px
- heightPixels:高度
- densityDpi:密度
- density:密度比值(密度/标准密度,即480/160=3),单位英寸下可以容纳多少个点
- scaledDensity:同density,用于文字缩放的计算也就是sp
- xDpi:水平方向的真实密度,水平方向上1inch实际上容纳的点的数量
- yDpi:垂直方向的真实密度
densityDpi和density关系:
density就是densityDpi除以标准密度160的出来的一个比值(参考上图),主要用于常用dp的计算,比如小米4c控件宽设为360dp的话,换算成像素就是1080px就是全屏了。
densityDpi和xDpi、yDpi的关系:
xDpi和yDpi是屏幕真实的屏幕密度,如上面小米mix2获取是403.411,而小米宣传的mix2屏幕密度就是403ppi,densityDpi大概是厂家设定的一个值,界面适配基本也只会使用densityDpi
屏 幕 密 度 = 屏 幕 对 角 线 的 像 素 点 数 量 屏 幕 尺 寸 屏幕密度 = \frac {屏幕对角线的像素点数量}{屏幕尺寸} 屏幕密度=屏幕尺寸屏幕对角线的像素点数量
public static float applyDimension(int unit, float value,
DisplayMetrics metrics) {
switch (unit) {
case COMPLEX_UNIT_PX:
return value;
case COMPLEX_UNIT_DIP:
return value * metrics.density;
case COMPLEX_UNIT_SP:
return value * metrics.scaledDensity;
case COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f / 72);
case COMPLEX_UNIT_IN:
return value * metrics.xdpi;
case COMPLEX_UNIT_MM:
return value * metrics.xdpi * (1.0f / 25.4f);
}
return 0;
}