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