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

Android实现屏幕各尺寸的获取的示例

程序员文章站 2023-12-18 17:53:52
在开发中我们会遇到各种需要获得屏幕参数的场景,当中也有不少坑,所以现在就记录一下这些参数的获取方式。以免再入坑。 物理屏幕宽高 一、底部没有虚拟按键 这里获取到的...

在开发中我们会遇到各种需要获得屏幕参数的场景,当中也有不少坑,所以现在就记录一下这些参数的获取方式。以免再入坑。

物理屏幕宽高

一、底部没有虚拟按键

这里获取到的宽高,就是你眼睛能看到的,屏幕亮着的地方的宽高。

  /**
   * 获取屏幕的宽
   *
   * @param context
   * @return
   */
  public static int getscreenwidth(context context) {
    windowmanager wm = (windowmanager) context.getsystemservice(context.window_service);
    displaymetrics dm = new displaymetrics();
    wm.getdefaultdisplay().getmetrics(dm);
    return dm.widthpixels;
  }

  /**
   * 获取屏幕的高度
   *
   * @param context
   * @return
   */
  public static int getscreenheight(context context) {
    windowmanager wm = (windowmanager) context.getsystemservice(context.window_service);
    displaymetrics dm = new displaymetrics();
    wm.getdefaultdisplay().getmetrics(dm);
    return dm.heightpixels;
  }

二、底部有虚拟按键

华为手机底部都会有一个黑色的虚拟按键(navigationbar),通过上面这个方式得到的屏幕高度是屏幕真是高度-虚拟按键的高度。所以有虚拟按键的情况获取屏幕的高度就是另一种方法了。

  public static int getrealheight(context context) {
    windowmanager wm = (windowmanager) context.getsystemservice(context.window_service);
    display display = wm.getdefaultdisplay();
    int screenheight = 0;

    if (build.version.sdk_int >= build.version_codes.jelly_bean_mr1) {
      displaymetrics dm = new displaymetrics();
      display.getrealmetrics(dm);
      screenheight = dm.heightpixels;

      //或者也可以使用getrealsize方法
//      point size = new point();
//      display.getrealsize(size);
//      screenheight = size.y;
    } else if (build.version.sdk_int >= build.version_codes.ice_cream_sandwich) {
      try {
        screenheight = (integer) display.class.getmethod("getrawheight").invoke(display);
      } catch (exception e) {
        displaymetrics dm = new displaymetrics();
        display.getmetrics(dm);
        screenheight = dm.heightpixels;
      }
    }
    return screenheight;
  }

虚拟按键高度

虚拟按键(navigationbar)高度可以通过读取定义在android系统尺寸资源中的 navigation_bar_height 获得。

所以不管虚拟按键是显示还是隐藏,得到的结果都是一样的。

  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;
  }

状态栏高度

状态栏就是屏幕顶部显示时间,电池,wifi 等信息的栏目。

方法一:系统提供了一个resource类,通过这个类可以获取资源文件,借此可以获取 到status_bar_height 。

  public int getstatusbarheight() {
    int result = 0;
    int resourceid = getresources().getidentifier("status_bar_height", "dimen", "android");
    if (resourceid > 0) {
      result = getresources().getdimensionpixelsize(resourceid);
    }
    return result;
  }

方法2: 通过放射

android的所有资源都会有惟一标识在r类中作为引用。我们也可以通过反射获取r类的实例域,然后找 status_bar_height。

  public void getstatusbarheightbyreflect() {
    int statusbarheight2 = -1;
    try {
      class<?> clazz = class.forname("com.android.internal.r$dimen");
      object object = clazz.newinstance();
      int height = integer.parseint(clazz.getfield("status_bar_height")
          .get(object).tostring());
      statusbarheight2 = getresources().getdimensionpixelsize(height);
    } catch (exception e) {
      e.printstacktrace();
    }
    log.e(tag, "状态栏高度-反射方式:" + statusbarheight2);
  }

借助应用区 top 属性。

状态栏位于屏幕的最顶端,坐标从 (0,0) 开始,所以应用区的顶部的位置就是状态栏的高度。

  /**
   * 应用区的顶端位置即状态栏的高度
   * *注意*该方法不能在初始化的时候用
   * */
  public void getstatusbarheightbytop() {
    
    rect rectangle = new rect();
    getwindow().getdecorview().getwindowvisibledisplayframe(rectangle);
    log.e(tag, "状态栏高度-应用区顶部:" + rectangle.top);
  }

应用区域高度

除去状态栏剩下的都时应用区。由此可知屏幕的高度 - 状态栏高度 = 应用区的高度。

/**
   * 不能在 oncreate 方法中使用。
   * 因为这种方法依赖于wms(窗口管理服务的回调)。正是因为窗口回调机制,所以在activity初始化时执行此方法得到的高度是0。
   * 这个方法推荐在回调方法onwindowfocuschanged()中执行,才能得到预期结果。
   */
  public void getappviewheight(){
    //屏幕
    displaymetrics dm = new displaymetrics();
    getwindowmanager().getdefaultdisplay().getmetrics(dm);
    //应用区域
    rect outrect1 = new rect();
    getwindow().getdecorview().getwindowvisibledisplayframe(outrect1);
    int statusbar = dm.heightpixels - outrect1.height(); //状态栏高度=屏幕高度-应用区域高度
    log.e(tag, "应用区高度:" + statusbar);
  }

setcontentview 高度,view 显示的高度

需要在见面创建后才能获取到。

public static int getcontentviewheight(activity activity) {
    rect rectangle= new rect();
    activity.getwindow().findviewbyid(window.id_android_content).getdrawingrect(rectangle);
    return rectangle.height();
  }

标题栏高度

标题栏高度 = 应用区高度 - view 显示高度

  public static void gettitlebarheight(activity activity) {
    rect outrect1 = new rect();
    activity.getwindow().getdecorview().getwindowvisibledisplayframe(outrect1);

    int viewtop = activity.getwindow().findviewbyid(window.id_android_content).gettop();  //要用这种方法
    int titlebarh = viewtop - outrect1.top;

    log.e(tag, "标题栏高度-计算:" + titlebarh);
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

上一篇:

下一篇: