Android-获取屏幕宽高

作者 : 开心源码 本文共5750个字,预计阅读时间需要15分钟 发布时间: 2022-05-12 共252人阅读

简介


开发过程中,经常需要对界面的View进行更精确的布局定位。在计算View的显示位置时,即可能需要获取Android屏幕的宽高信息。获取屏幕的宽高信息根据结果来区分,可分为两类:

  • 1.应用屏幕的宽高
  • 2.实际屏幕的宽高

Display与DisplayMetrics


Display和DisplayMetrics都记录了Android屏幕的基本信息,想要获取到屏幕宽高等信息,这两个类是必不可少的。

Display


Display官方参考文献(国内网址无需翻墙)

  • 类说明
    Provides information about the size and density of a logical display.提供正当显示的,有关大小和密度的信息。
  • 显示区域有2种形容方式
    • 应用程序的显示区域
      不包括了状态栏(刘海屏,水滴屏等),导航栏等系统UI所占用的空间
    • 实际显示区域
      包括了状态栏(刘海屏,水滴屏等),导航栏等系统UI所占用的空间

获取Display的方式


1.任意Context

    /**     * Get Display     * @param context Context for get WindowManager     * @return Display     */    private static Display getDisplay(Context context) {        WindowManager wm = (WindowManager) context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);        if (wm != null) {            return wm.getDefaultDisplay();        } else {            return null;        }    }

2.限Activity

  • 通过Activity类型的Context,不仅可以通过Context的方式获取到WindowManager,还可以直接通过Activity的getWindowManager()获取到WindowManager对象,进而获取到Display对象。
  • 通常我们需要获取屏幕的信息都是为了布局,假如是出于布局目的推荐直接这种方式获取Activity
    /**     * Get Display(限Activity类型的Context)     * @param activity Activity for get WindowManager     * @return Display     */    private static Display getDisplay(Activity activity) {        //WindowManager wm = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);        WindowManager wm = activity.getWindowManager();        if (wm != null) {            return wm.getDefaultDisplay();        } else {            return null;        }    }

3.结合上面2种方式(推荐)

    /**     * Get Display     * @param context Context for get WindowManager     * @return Display     */    private static Display getDisplay(Context context) {        WindowManager wm;        if (context instanceof Activity) {            Activity activity = (Activity) context;            wm = activity.getWindowManager();        } else {            wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);        }        if (wm != null) {            return wm.getDefaultDisplay();        }        return null;    }

Display中的屏幕信息


1. 获取应用屏幕宽度
  • 通过Display的getWidth()方法,该方法在Android4.1(API16)已经被弃用,用Display的
    getSize(Point outSize)方法代替。
       @Deprecated   private static int getScreenWidth(Context context) {       return getDisplay(context).getWidth();   }
  • 通过Display的getSize(Point outSize)方法。
     private static int getScreenWidth(Context context) {    Display display = getDisplay(context);    if (display == null) {        return 0;    }    Point point = new Point();    display.getSize(point);    return point.x; }
2. 获取实际屏幕宽度(API19)
  • 通过Display的getRealSize(Point outSize)方法。
     private static int getScreenRealWidth(Context context) {     Display display = getDisplay(context);     if (display == null) {         return 0;     }     Point outSize = new Point();     display.getRealSize(outSize);     return outSize.x; }
3. 获取应用屏幕高度
  • 通过Display的getHeight()方法,该方法在Android4.1(API16)已经被弃用,用Display的
    getSize(Point outSize)方法代替。
     @Deprecated private static int getScreenHeight(Context context) {     return getDisplay(context).getHeight(); }
  • 通过Display的getSize(Point outSize)方法。
     private static int getScreenHeight(Context context) {    Display display = getDisplay(context);    if (display == null) {        return 0;    }    Point point = new Point();    display.getSize(point);    return point.y; }
4. 获取实际屏幕的高度(API19)
  • 通过Display的getRealSize(Point outSize)方法。
     private static int getScreenRealHeight(Context context) {      Display display = getDisplay(context);      if (display == null) {          return 0;      }      Point outSize = new Point();      display.getRealSize(outSize);      return outSize.y;  }

DisplayMetrics(推荐)


DisplayMetrics官方参考文献

  • 类说明
    A structure describing general information about a display, such as its size, density, and font scaling.形容少量显示信息,例如它的大小、密度和字体缩放。

获取DisplayMetrics的方式


1. Display
  • 精确来说这个方法是Display通过DisplayMetrics来获取信息,下面拿一个获取屏幕宽度举例
      private static int getScreenWidth(Context context) {      DisplayMetrics outMetrics = new DisplayMetrics();      getDisplay(context).getMetrics(outMetrics);      return outMetrics.widthPixels;  }
2. Resources(推荐)
  • 更便捷的获取
     private static DisplayMetrics getMetrics(Context context) {     return context.getResources().getDisplayMetrics(); }

DisplayMetrics中的屏幕信息


1. 获取应用屏幕宽度

 /**  * Get Screen Width  */ public static int getScreenWidth(Context context) {     return getDisplayMetrics(context).widthPixels; }

2. 获取应用屏幕高度

 /**  * Get Screen Height  */ public static int getScreenHeight(Context context) {     return getDisplayMetrics(context).heightPixels; }

3.获取屏幕的Density和Dpi

/**  * Get Density  */ private static float getDensity(Context context) {     return getDisplayMetrics(context).density; } /**  * Get Dpi  */ private static int getDpi(Context context) {     return getDisplayMetrics(context).densityDpi; }

4.获取屏幕的实际高度(API14)

  /**     * Get Screen Real Height     *     * @param context Context     * @return Real Height     */    public static int getRealHeight(Context context) {        Display display = getDisplay(context);        int screenHeight = 0;        //版本API 19        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {            DisplayMetrics dm = new DisplayMetrics();            display.getRealMetrics(dm);            screenHeight = dm.heightPixels;        //版本API 14            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {            try {                screenHeight = (Integer) Display.class.getMethod("getRawHeight").invoke(display);            } catch (Exception e) {                screenHeight = getScreenHeight(context);            }        }        return screenHeight;    }

5.获取屏幕的实际高度(API19)

 /**     * Get Screen Real Height     *     * @param context Context     * @return Real Height     */    public static int getRealHeight(Context context) {        Display display = getDisplay(context);        if (display == null) {            return 0;        }        DisplayMetrics dm = new DisplayMetrics();        display.getRealMetrics(dm);        return dm.heightPixels;    }

6. 获取屏幕的实际宽度(API14)

    /**     * Get Screen Real Width     * @param context Context     * @return Real Width     */    public static int getRealWidth(Context context) {        Display display = getDisplay(context);        int screenWidth = 0;        //版本高于API 19        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {            DisplayMetrics dm = new DisplayMetrics();            display.getRealMetrics(dm);            screenWidth = dm.widthPixels;            //版本高于API 14 ,小于API 14        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {            try {                screenWidth = (Integer) Display.class.getMethod("getRawWidth").invoke(display);            } catch (Exception e) {                screenWidth = getScreenWidth(context);            }        }        return screenWidth;    }

7. 获取屏幕的实际宽度(API19)

    /**     * Get Screen Real Width     *     * @param context Context     * @return Real Width     */    public static int getRealWidth(Context context) {        Display display = getDisplay(context);        if (display == null) {            return 0;        }        DisplayMetrics dm = new DisplayMetrics();        display.getRealMetrics(dm);        return dm.widthPixels;    }

总结


通过Display和DisplayMetrics可以取得基本屏幕了信息,有了这些信息,可以对界面进行更好的布局,接下来会对屏幕信息进行封装出ScreenInfoUtils工具类

  • ScreenInfoUtils
    • 获取屏幕宽高信息
    • 获取屏幕Dpi和Density
    • 获取状态栏和导航栏高度
    • 能否包含导航栏
    • 打印屏幕信息

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Android-获取屏幕宽高

发表回复