状态栏:显示手机状态(信号、电量等)信息的那个栏
标题栏:显示应用标题的那个栏
导航栏:部分手机底部的虚拟导航栏
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
/**
* 获取屏幕的宽/高(屏幕展示高度):
注:
如果手机没有底部虚拟导航栏则:此高度==屏幕完整高度
如果手机有底部虚拟导航栏则:此高度==屏幕完整高度-导航栏高度
方法一
*/
DisplayMetrics dm = new DisplayMetrics();
mActivity.getWindowManager().getDefaultDisplay().getMetrics(dm);
int screenW = dm.widthPixels;
int screenH = dm.heightPixels;
/**
*方法二
*/
WindowManager windowManager =
(WindowManager)mActivity.getSystemService(Context.WINDOW_SERVICE);
windowManager.getDefaultDisplay().getMetrics(dm);
int width = dm.widthPixels;
int height = dm.heightPixels;
/**
*方法三
*/
int width2 = mActivity.getResources().getDisplayMetrics().widthPixels;
int height2 = mActivity.getResources().getDisplayMetrics().heightPixels;
/**
*方法四
*/
int width3 = appContext.getResources().getDisplayMetrics().widthPixels;
int height3 = appContext.getResources().getDisplayMetrics().heightPixels;
/**
*方法五
*/
WindowManager windowManager =
(WindowManager)appContext.getSystemService(Context.WINDOW_SERVICE);
windowManager.getDefaultDisplay().getMetrics(dm);
int width = dm.widthPixels;
int height = dm.heightPixels;
//以上五种方法中:
//方法一二三是通过Activity获取当前APP的宽高。
//方法四五是通过ApplicationContext来获取屏幕的宽高。
//两者区别:
//当处于分屏模式时,前者只是当前分屏APP的宽高。
//后者是这个设备屏幕宽高。
//注:
//某些情况下(具体原因待研究)带有底部虚拟导航栏的设备--在使用方法三四五获取屏幕展示高度时
//不包含状态栏,此时可以可以换用方法一二来获取。
/**
* 获取屏幕完整高度(屏幕展示高度+导航栏)[针对具有导航栏的手机]
方法一
*/
int realScreenH = 0;
if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1) {
getWindowManager().getDefaultDisplay().getRealMetrics(dm);
realScreenH = dm.heightPixels;
}
/**
* 方法二:通过反射获取
*/
Display display = mActivity.getWindowManager().getDefaultDisplay();
DisplayMetrics dm = new DisplayMetrics();
int realScreenH = 0;
Class c = Class.forName("android.view.Display");
Method method = c.getMethod("getRealMetrics", DisplayMetrics.class);
method.invoke(display, dm);
realScreenH = dm.heightPixels;
/**
* 状态栏高度
*/
Rect frame = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
int statusBarHeight = frame.top;
/**
* 标题栏高度
*/
View v = getWindow().findViewById(Window.ID_ANDROID_CONTENT);
int contentTop = v.getTop();
int titleBarHeight = contentTop - statusBarHeight;
/**
* 获取虚拟导航栏高度
*/
int navigationBarH = realScreenH - screenH;
Logger.d("screenW:" + screenW + "\n" + "screenH:" + screenH + "\n" + "realScreenH:" + realScreenH
+ "\n" + "statusBarHeight:" + statusBarHeight + "\n"
+ "titleBarHeight:" + titleBarHeight + "\n" + "navigationBarH:" + navigationBarH);
}
参考 https://blog.csdn.net/u012440207/article/details/48000525