在Android中获取屏幕像素尺寸的方法

在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();
// Gets all excluding insets
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;

// Legacy size that Display#getSize reports
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(); // deprecated
int height = display.getHeight(); // deprecated

使用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.Activity
import android.content.Context
import android.os.Build
import android.util.DisplayMetrics
import android.view.WindowInsets
import android.view.WindowManager

fun 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())已被弃用,使用时会有警告,建议使用新的方法替代。
  • 屏幕适配问题:不同设备的屏幕尺寸和分辨率不同,可能会导致布局显示不一致,需要进行适当的适配处理。
  • 系统栏影响:获取的屏幕尺寸可能会受到系统栏(如状态栏、导航栏)的影响,需要根据实际需求进行处理。

在Android中获取屏幕像素尺寸的方法
https://119291.xyz/posts/how-to-get-screen-dimensions-as-pixels-in-android/
作者
ww
发布于
2025年5月26日
许可协议