类说明
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(推荐)
类说明
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; }
作者:自导自演的机器人
链接:https://www.jianshu.com/p/f8fd3a6e9c3d