简介
开发过程中,经常需要对界面的View进行更准确的布局定位。在计算View的显示位置时,就可能需要获取Android屏幕的宽高信息。获取屏幕的宽高信息根据结果来区分,可分为两类:
- 1.应用屏幕的宽高
- 2.实际屏幕的宽高
Display与DisplayMetrics
Display和DisplayMetrics都记录了Android屏幕的基本信息,想要获取到屏幕宽高等信息,这两个类是必不可少的。
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(推荐)
-
类说明
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
- 获取状态栏和导航栏高度
- 是否包含导航栏
- 打印屏幕信息
网友评论