欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android获取屏幕宽高

程序员文章站 2022-03-10 17:10:13
...

一、 前言

android 4.4(sdk 19)之后,获取屏幕高度需要考虑底部导航栏等decor。网上很多方案是没有考虑这一点的,因此获取到的屏幕高度小于实际高度,误导开发者。


二、 错误方案

列举几种常见的获取出来高度可能小于实际高度的方案:

1.

DisplayMetrics dm = getApplicationContext().getResources().getDisplayMetrics(); 
int screenWidth = dm.widthPixels; 
int screenHeight = dm.heightPixels; 

2.

Display display = getWindowManager().getDefaultDisplay();
int screenWidth  = display.getWidth();
int screenHeight = display.getHeight();

3.

WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
int screenWidth = wm.getDefaultDisplay().getWidth();
int screenHeight = wm.getDefaultDisplay().getHeight();

4.

DisplayMetrics outMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(outMetrics);
int screenWidth = outMetrics.widthPixels;
int screenHeight = outMetrics.heightPixels;

三、 正确方案

以下是供参考的获取完整高度的方案:

1.

WindowManager windowManager = (WindowManager) getApplication().getSystemService(Context.WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
Point outPoint = new Point();
if (Build.VERSION.SDK_INT >= 19) {
    // 可能有虚拟按键的情况
    display.getRealSize(outPoint);
} else {
    // 不可能有虚拟按键
    display.getSize(outPoint);
}
int mRealSizeWidth;//手机屏幕真实宽度
int mRealSizeHeight;//手机屏幕真实高度
mRealSizeHeight = outPoint.y;
mRealSizeWidth = outPoint.x;

2.

DisplayMetrics metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getRealMetrics(metric);
int width = metric.widthPixels; // 宽度(PX)
int height = metric.heightPixels; // 高度(PX)

四、 源码解读

以上方法的区别在于”getRealSize”和”getRealMetrics”,查看源码:

1.getMetrics:

Android获取屏幕宽高

  • 包含decor时,返回的size可能不准确
  • 老式机型下可能不准确
  • 可能因WindowManager而改变

2.getRealSize:

Android获取屏幕宽高

  • 获取的size没有减去任何decor或者考虑缩放因素
  • 使用”adb shell wm size”可以查看设备的物理尺寸

3.getRealMetrics:

Android获取屏幕宽高

  • 基于getRealSize实现

五、 参考文献