一、问题描述
目前很多手机主流手机将Back键、Home键、Menu键设计成虚拟功能键。当我们获取屏幕高度时就会遇到问题,获取到的并不是实际的高度,从而不能正确的布局。
下边通过俩种方式获取:
1.通过判断(Build.VERSION.SDK_INT >= 17)使用方法getRealMetrics()获取。
2.通过反射调用getRealMetrics获取。
二、正确方法
// 方法一
public void initScreenInfo(Context context) {
try {
DisplayMetrics dm = new DisplayMetrics();
// 测试设备 1440*2960 --- SDK VERSION 24 --- 包含虚拟功能键
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRealMetrics(dm); // 包含虚拟功能键高度 dm.heightPixels = 2960
} else {
((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(dm); // 不包含虚拟功能键高度 dm.heightPixels = 2768
}
int WIDTH = Math.min(dm.widthPixels, dm.heightPixels);
int HEIGHT = Math.max(dm.widthPixels, dm.heightPixels);
float DENSITY = dm.density;
int DENSITY_DPI = dm.densityDpi;
float SCALED_DENSITY = dm.scaledDensity;
tv.setText(" WIDTH:" + WIDTH + " HEIGHT:" + HEIGHT + " DENSITY:" + DENSITY + " DENSITY_DPI:" + DENSITY_DPI + " SCALED_DENSITY:" + SCALED_DENSITY);
} catch (Exception e) {
e.printStackTrace();
}
}
// 方法二
private void initScreenInfo() {
Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics dm = new DisplayMetrics();
Class c;
try {
c = Class.forName("android.view.Display");
Method method = c.getMethod("getRealMetrics", DisplayMetrics.class);
method.invoke(display, dm);
int HEIGHT = dm.heightPixels;
int WIDTH = dm.widthPixels;
tv2.setText(" WIDTH:" + WIDTH + " HEIGHT:" + HEIGHT);
} catch (Exception e) {
e.printStackTrace();
}
}