Android 获取屏幕宽高的两种方式

第一种

WindowManager manager = (WindowManager) context                .getSystemService(Context.WINDOW_SERVICE);        Display display = manager.getDefaultDisplay();        Point point = new Point();        if(Build.VERSION.SDK_INT < 17) {            display.getSize(point);        } else {            display.getRealSize(point);        }        int width = point.x;        int height = point.y;

第二种

 DisplayMetrics metrics = new DisplayMetrics();        Display display = activity.getWindowManager().getDefaultDisplay();        if(Build.VERSION.SDK_INT < 17) {            display.getMetrics(metrics);        } else {            display.getRealMetrics(metrics);        }        int width = metrics.widthPixels;        int height = metrics.heightPixels;

这两种方式得到的值是一致的。那么他们四者之间的区别是什么呢?

getSize/getMetrics 与 getRealMetrics/getRealSize

getSize/getMetrics获取到的是App逻辑显示尺寸,而getRealMetrics/getRealSize获取到的是实际屏幕显示尺寸。
具体区别规则如下:

  1. getSize/getMetrics返回的尺寸,会除去那些一直显示的系统装饰元素,例如虚拟导航栏
  2. getSize/getMetrics返回的尺寸,为了兼容那些为更小显示尺寸的旧应用,会被等比例缩放至合适的值。
  3. 不同的WindowManager实例获取到的Display对象也不同。

    • 如果是通过非Activity类型的上下文获取到的WindowManager,getSize/getMetrics返回的尺寸是基于当前屏幕旋转方向的全部显示尺寸,当然还要除去系统装饰区域。

      appContext.getSystemService(Context.WINDOW_SERVICE);
    • 如果是通过Activity类型的上下文获取到WindowManager,getSize/getMetrics返回的尺寸和应用窗口尺寸一致。例如在多窗口模式下,应用窗口尺寸比物理尺寸小。

      activity.getWindowManager();activity.getSystemService(Context.WINDOW_SERVICE);

另外,通过Point类可以看出,getSize和getRealSize只能获取显示尺寸。

//android.graphics.Pointpublic class Point implements Parcelable {    public int x;    public int y;    ...}

而getMetrics和getRealMetrics方法,除了可以获取屏幕尺寸,还有其他屏幕相关信息,例如屏幕密度、文字缩放比例等。

我们在开发时往往并不需要包含虚拟按键区域的真实屏幕高度,应用显示区域高度足够了。

更多相关文章

  1. Android(安卓)屏幕滑动事件
  2. 获取安装的应用
  3. android获取手机已经安装的app信息
  4. Google API应用
  5. Android(安卓)屏幕滑动事件
  6. 关于屏幕解锁的实例
  7. android 通过资源文件名称获取资源文件id
  8. android GPS 获取位置
  9. Android(安卓)副屏开发

随机推荐

  1. C语言的三种基本程序结构是什么
  2. c语言源文件经过编译后生成文件的后缀是
  3. c语言是一种什么的程序设计语言?
  4. c语言指针用法有哪些
  5. c语言中,char型数据是以什么形式存储的?
  6. C语言怎么合并两个有序链表
  7. c语言程序的执行总是起始于什么?
  8. vc++6.0怎么新建c语言文件
  9. using用法是什么
  10. c语言volatile关键字的作用是什么?