自从有了全面屏,就有了虚拟按键,我们该如何获取 屏幕的真实高度 以及 虚拟键的高度 呢?
之前我们使用的都是下面的方法,但有一个问题就是,在全面屏中,它获取到的高度是不包含下面导航键的高度的:
public static int getHeight(Context context) {
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
DisplayMetrics dm = new DisplayMetrics();
display.getMetrics(dm);
int height = dm.heightPixels;
return height;
}
获取屏幕的真实高度
public static int getRealHeight(Context context) {
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
DisplayMetrics dm = new DisplayMetrics();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
display.getRealMetrics(dm);
} else {
display.getMetrics(dm);
}
int realHeight = dm.heightPixels;
return realHeight;
}
获取虚拟导航键的高度
其实,可以直接用上面的getRealHeight(Context) - getHeight(Context),下面是利用反射的方法:
public static int getVirtualBarHeight(Context context) {
int vh = 0;
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
DisplayMetrics dm = new DisplayMetrics();
try {
@SuppressWarnings("rawtypes")
Class c = Class.forName("android.view.Display");
@SuppressWarnings("unchecked")
Method method = c.getMethod("getRealMetrics", DisplayMetrics.class);
method.invoke(display, dm);
vh = dm.heightPixels - display.getHeight();
} catch (Exception e) {
e.printStackTrace();
}
return vh;
}