运行效果图

为了方便获取屏幕相关的数据,写了个屏幕工具类
//获取屏幕的宽高(包含虚拟按键)
public static Point getScreenSize(@NonNull final Activity context) {
WindowManager windowManager = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
final Display display = windowManager.getDefaultDisplay();
Point outPoint = new Point();
display.getSize(outPoint);
return outPoint;
}
//获取屏幕的宽高(包含虚拟导航栏)
public static Point getScreenRealSize(@NonNull final Activity context) {
WindowManager windowManager = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
final Display display = windowManager.getDefaultDisplay();
Point outPoint = new Point();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {// 可能有虚拟按键的情况
display.getRealSize(outPoint);
} else {// 不可能有虚拟按键
display.getSize(outPoint);
}
return outPoint;
}
//获取屏幕的宽高(包含虚拟按键)
public static Point getScreenSizeDP(@NonNull final Activity context) {
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics outMetrics = new DisplayMetrics();
windowManager.getDefaultDisplay().getMetrics(outMetrics);
int widthPixels = outMetrics.widthPixels;
int heightPixels = outMetrics.heightPixels;
int densityDpi = outMetrics.densityDpi;
float density = outMetrics.density;
int x_dp = (int) (outMetrics.widthPixels / density);
int y_dp = (int) (outMetrics.heightPixels / density);
return new Point(x_dp,y_dp);
}
//获取状态栏高度
public static int getStatusBarHeight(@NonNull final Activity context) {
int result = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (result > 0) {
return context.getResources().getDimensionPixelSize(result);
}
return 0;
}
//获取导航栏高度
public static int getNavigationBarHeight(@NonNull final Activity context) {
int result = context.getResources().getIdentifier("navigation_bar_height", "dimen", "android");
if (result > 0){
return context.getResources().getDimensionPixelSize(result);
}
return 0;
}
//是否有虚拟导航栏
public static boolean hasNavigationBar(@NonNull final Activity context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
Point size = getScreenSize(context);
Point realSize = getScreenRealSize(context);
return realSize.y != size.y || realSize.x != size.x;
} else {
boolean menu = ViewConfiguration.get(context).hasPermanentMenuKey();
boolean back = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);
if(menu || back) {
return false;
}else {
return true;
}
}
}
//NavigationBar显示/隐藏
public static boolean isNavigationBarShow(@NonNull final Activity context){
if (!hasNavigationBar(context)) {
return false;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
Point size = getScreenSize(context);
Point realSize = getScreenRealSize(context);
Rect visibleRect = getScreenVisibleRect(context);
return visibleRect.bottom != realSize.y && realSize.y!=size.y;
}else {
boolean menu = ViewConfiguration.get(context).hasPermanentMenuKey();
boolean back = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);
if(menu || back) {
return false;
}else {
return true;
}
}
}
//应用显示区域
public static Rect getScreenVisibleRect(@NonNull final Activity context) {
Rect outRect = new Rect();
context.getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect);
return outRect;
}
Demo下载