您的位置:首页 > 移动开发 > Android开发

Android中DisplayMetrics类获取屏幕尺寸

2019-06-07 20:17 1946 查看

“缘起”

平时上班忙,没太多时间给自己充电,趁着过端午节敲敲代码练练手,在我想要把PopupWindow高度设置成屏幕高度的1/3时,发现获取到的屏幕高度有问题。

打印日志如下:
2019-06-07 18:37:03.230 27737-27737/customizedView.demmo.com E/znk: onClick: getWindowHeight == 2040
2019-06-07 18:37:03.231 27737-27737/customizedView.demmo.com E/znk: onClick: getWindowWidth == 1080
2019-06-07 18:37:03.232 27737-27737/customizedView.demmo.com E/znk: onClick: getRelHeight == 2160
而我用adb命令获取到的屏幕高度是2160(此处的单位是像素,且是绝对像素,即设备物理像素)

通过自定义的getWindowHeightOrWidth方法获取的屏幕高度是2040,方法定义如下:

[code]    public static int getWindowHeightOrWidth(Activity activity, int flag) {
DisplayMetrics dm = activity.getResources().getDisplayMetrics();
//取得窗口属性
activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
//窗口高度
int screenHeight = dm.heightPixels;
//窗口的宽度
int screenWidth = dm.widthPixels;
//可以通过DisplayMetrics类来获取当前窗口的一些信息,DisplayMetrics对象中,取得的宽高维度是以像素为单位(Pixel),“像素”所指的是“绝对像素”而非“相对像素”,
//绝对像素就是设备的物理像素.PS:手机分辨率就是设备像素
Log.e(Constants.TAG, dm.toString());
return flag == 0 ? screenHeight : screenWidth;
}

为什么获取的高度会小于手机实际高度?原因是这个方法获取的是手机屏幕显示高度,不包含虚拟导航栏,源码的注释是这么写的:大概意思是说如果我们通过Actiivty的引用调用getWindowManager()或者getSystemService(Context.WINDOW_SERVICE)获取WindowManager,那么获取到的尺寸可能小于实际物理尺寸。

解决方案

而真实的高度要通过如下方法获取:

[code]    /**
* 获取屏幕完整高度(屏幕展示高度+导航栏)[针对具有导航栏的手机]
*/
public static int getRelHeight(Activity activity) {

DisplayMetrics dm = new DisplayMetrics();
int realScreenH = 0;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {//好像是4.2之后才有的虚拟导航栏,目前市面上绝大多数手机都有导航栏
activity.getWindowManager().getDefaultDisplay().getRealMetrics(dm);
realScreenH = dm.heightPixels;
return realScreenH;
}
return getWindowHeightOrWidth(activity,Constants.WINDOW_HEIGHT);
}

有写的不对的地方,欢迎大佬们指正!此博客项目源码地址:https://github.com/ZNKForSky/CustomizedView 欢迎各位童鞋star~

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: