美文网首页Android知识
Android-获取屏幕宽高

Android-获取屏幕宽高

作者: 积木Blocks | 来源:发表于2018-12-18 18:52 被阅读5次

简介


开发过程中,经常需要对界面的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
    • 获取状态栏和导航栏高度
    • 是否包含导航栏
    • 打印屏幕信息

相关文章

网友评论

    本文标题:Android-获取屏幕宽高

    本文链接:https://www.haomeiwen.com/subject/vzbahqtx.html