在Android中获取屏幕像素尺寸的方法 技术背景 在Android开发中,有时需要获取屏幕的像素尺寸,以实现适配不同屏幕大小的功能,如布局的动态调整、元素的定位等。随着Android系统版本的不断更新,获取屏幕尺寸的方法也有所变化。
实现步骤 API Level 30及以上 对于API Level 30及以上版本,可以使用WindowMetrics.getBounds()
方法。示例代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 final WindowMetrics metrics = windowManager.getCurrentWindowMetrics();final WindowInsets windowInsets = metrics.getWindowInsets();Insets insets = windowInsets.getInsetsIgnoringVisibility(WindowInsets.Type.navigationBars() | WindowInsets.Type.displayCutout());int insetsWidth = insets.right + insets.left;int insetsHeight = insets.top + insets.bottom;final Rect bounds = metrics.getBounds();final Size legacySize = new Size (bounds.width() - insetsWidth, bounds.height() - insetsHeight);
API Level 13及以上 在API Level 13及以上版本,可以使用getSize()
方法:
1 2 3 4 5 Display display = getWindowManager().getDefaultDisplay();Point size = new Point (); display.getSize(size);int width = size.x;int height = size.y;
如果不在Activity
中,可以通过WINDOW_SERVICE
获取默认的Display
:
1 2 WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);Display display = wm.getDefaultDisplay();
在Fragment中,可以使用Activity.WindowManager
(在Xamarin.Android中)或getActivity().getWindowManager()
(在Java中)。
API Level 13以下 在getSize()
方法引入之前(API level 13之前),可以使用getWidth()
和getHeight()
方法,但这两个方法现在已被弃用:
1 2 3 Display display = getWindowManager().getDefaultDisplay(); int width = display.getWidth(); int height = display.getHeight();
使用DisplayMetrics
另一种方法是使用DisplayMetrics
:
1 2 3 4 DisplayMetrics metrics = new DisplayMetrics (); getWindowManager().getDefaultDisplay().getMetrics(metrics);int width = metrics.widthPixels;int height = metrics.heightPixels;
支持低版本的兼容方案 如果需要支持Honeycomb之前的版本,需要进行向后兼容处理:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 int measuredWidth = 0 ;int measuredHeight = 0 ;WindowManager w = getWindowManager();if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { Point size = new Point (); w.getDefaultDisplay().getSize(size); measuredWidth = size.x; measuredHeight = size.y; } else { Display d = w.getDefaultDisplay(); measuredWidth = d.getWidth(); measuredHeight = d.getHeight(); }
Kotlin实现 1 2 3 4 5 6 7 8 9 10 11 fun getScreenHeight (activity: Activity ) : Int { val metrics = DisplayMetrics() activity.windowManager.defaultDisplay.getMetrics(metrics) return metrics.heightPixels }fun getScreenWidth (activity: Activity ) : Int { val metrics = DisplayMetrics() activity.windowManager.defaultDisplay.getMetrics(metrics) return metrics.widthPixels }
核心代码 Java获取屏幕尺寸的工具类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 import android.app.Activity;import android.content.Context;import android.graphics.Point;import android.os.Build;import android.view.Display;import android.view.WindowManager;import android.view.WindowMetrics;import android.view.WindowInsets;import android.graphics.Insets;import android.graphics.Rect;import android.util.Size;public class ScreenUtils { public static int getScreenWidth (Activity activity) { if (Build.VERSION.SDK_INT < 30 ) { DisplayMetrics displayMetrics = new DisplayMetrics (); activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); return displayMetrics.widthPixels; } else { WindowMetrics metrics = activity.getWindowManager().getCurrentWindowMetrics(); Insets insets = metrics.getWindowInsets() .getInsetsIgnoringVisibility(WindowInsets.Type.systemBars()); return metrics.getBounds().width() - insets.left - insets.right; } } public static int getScreenHeight (Activity activity) { if (Build.VERSION.SDK_INT < 30 ) { DisplayMetrics displayMetrics = new DisplayMetrics (); activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); return displayMetrics.heightPixels; } else { WindowMetrics metrics = activity.getWindowManager().getCurrentWindowMetrics(); Insets insets = metrics.getWindowInsets() .getInsetsIgnoringVisibility(WindowInsets.Type.systemBars()); return metrics.getBounds().height() - insets.bottom - insets.top; } } }
Kotlin扩展函数获取屏幕尺寸 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 import android.app.Activityimport android.content.Contextimport android.os.Buildimport android.util.DisplayMetricsimport android.view.WindowInsetsimport android.view.WindowManagerfun Context?.screenWidthInPx () : Int { if (this == null ) return 0 val dm = DisplayMetrics() val wm = this .getSystemService(Context.WINDOW_SERVICE) as WindowManager wm.defaultDisplay.getMetrics(dm) return dm.widthPixels }fun Context?.screenHeightInPx () : Int { if (this == null ) return 0 val dm = DisplayMetrics() val wm = this .getSystemService(Context.WINDOW_SERVICE) as WindowManager wm.defaultDisplay.getMetrics(dm) return dm.heightPixels }fun Activity.getScreenWidth () : Int { return if (Build.VERSION.SDK_INT < 30 ) { val displayMetrics = DisplayMetrics() windowManager.defaultDisplay.getMetrics(displayMetrics) displayMetrics.widthPixels } else { val metrics = windowManager.currentWindowMetrics val insets = metrics.windowInsets .getInsetsIgnoringVisibility(WindowInsets.Type.systemBars()) metrics.bounds.width() - insets.left - insets.right } }fun Activity.getScreenHeight () : Int { return if (Build.VERSION.SDK_INT < 30 ) { val displayMetrics = DisplayMetrics() windowManager.defaultDisplay.getMetrics(displayMetrics) displayMetrics.heightPixels } else { val metrics = windowManager.currentWindowMetrics val insets = metrics.windowInsets .getInsetsIgnoringVisibility(WindowInsets.Type.systemBars()) metrics.bounds.height() - insets.top - insets.bottom } }
最佳实践 版本兼容 :在开发中,要考虑不同Android版本的兼容性,使用合适的方法获取屏幕尺寸。避免使用弃用方法 :尽量避免使用已被弃用的方法,如getWidth()
和getHeight()
,以确保代码的稳定性和可维护性。动态布局 :根据屏幕尺寸动态调整布局,以实现更好的用户体验。常见问题 方法弃用 :一些旧的方法(如getWidth()
和getHeight()
)已被弃用,使用时会有警告,建议使用新的方法替代。屏幕适配问题 :不同设备的屏幕尺寸和分辨率不同,可能会导致布局显示不一致,需要进行适当的适配处理。系统栏影响 :获取的屏幕尺寸可能会受到系统栏(如状态栏、导航栏)的影响,需要根据实际需求进行处理。