项目场景:
问题:计算android手机屏幕大小以及状态栏和导航栏高度
1.不考虑状态栏和导航栏高度
2.考虑导航栏和状态栏高度
相关代码
在导航栏和状态栏均正常显示时
/**
* 不包含导航栏和状态栏高度-方法1
* @param context
* @return
*/
public static int getScreenWidth(Context context) {
return context.getResources().getDisplayMetrics().widthPixels;
}
public static int getScreenHeight(Context context) {
return context.getResources().getDisplayMetrics().heightPixels;
}
/**
* 不包含导航栏和状态栏高度-方法2
* @param context
* @return
*/
public static int getScreenWidth2(Context context) {
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(dm);
return dm.widthPixels;
}
public static int getScreenHeight2(Context context) {
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(dm);
return dm.heightPixels;
}
方法1和2得到的高度如下
getResources().getDisplayMetrics():: widthPixels: 1080
getResources().getDisplayMetrics():: heightPixels: 2190
WindowManager:: widthPixels: 1080
WindowManager:: heightPixels: 2190
/**
* 包含导航栏和状态栏高度-方法3
* @param context
* @return
*/
public static int getScreenWidth4(Context context) {
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
wm.getDefaultDisplay().getRealMetrics(dm);
return dm.widthPixels;
}
public static int getScreenHeight4(Context context) {
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
wm.getDefaultDisplay().getRealMetrics(dm);
return dm.heightPixels;
}
/**
* 包含导航栏和状态栏高度-方法4
* @param context
* @return
*/
public static int getScreenWidth3(Context context) {
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display defaultDisplay = windowManager.getDefaultDisplay();
Point outPoint = new Point();
defaultDisplay.getRealSize(outPoint);
return outPoint.x;
}
public static int getScreenHeight3(Context context) {
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display defaultDisplay = windowManager.getDefaultDisplay();
Point outPoint = new Point();
defaultDisplay.getRealSize(outPoint);
return outPoint.y;
}
public static int getNavigationBarHeight(Context context) {
int navigationBarHeight = -1;
Resources resources = context.getResources();
int resourceId = resources.getIdentifier("navigation_bar_height","dimen", "android");
if (resourceId > 0) {
navigationBarHeight = resources.getDimensionPixelSize(resourceId);
}
return navigationBarHeight;
}
public int getStatusBarHeight(Context context) {
int result = 0;
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
方法3和4得到的高度如下
WindowManager:: widthPixels getRealMetrics: 1080
WindowManager:: heightPixels getRealMetrics: 2400
WindowManager getRealSize() :: widthPixels: 1080
WindowManager getRealSize() :: heightPixels: 2400
getResources() navigation_bar_height: 130
getResources() getStatusBarHeight: 80
在实际设备中,分辨率为2400*1080,因此,方法3和4得到的才是屏幕的宽和高。
之所以分析这个问题,是为了得到getLocationOnScreen方法一致的结果,因为getLocationOnScreen获取到的是View左上顶点在屏幕中的绝对位置.(屏幕范围包括状态栏)
参考:https://www.cnblogs.com/yongdaimi/p/10796044.html
https://blog.csdn.net/u013868665/article/details/115402650