Android知识

Android-获取屏幕宽高

2018-12-18  本文已影响5人  积木Blocks

简介


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

Display与DisplayMetrics


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

Display


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

获取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

    /**
     * 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. 获取应用屏幕宽度
2. 获取实际屏幕宽度(API19)
3. 获取应用屏幕高度
4. 获取实际屏幕的高度(API19)

DisplayMetrics(推荐)


DisplayMetrics官方参考文献

获取DisplayMetrics的方式


1. Display
2. Resources(推荐)

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工具类

上一篇 下一篇

猜你喜欢

热点阅读