Android 获取屏幕尺寸的 Java 版本
以下是 Android 中获取屏幕尺寸的各种 Java 实现方法:
- 使用 DisplayMetrics(传统方法)
// 在 Activity 中
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
int screenWidth = displayMetrics.widthPixels;
int screenHeight = displayMetrics.heightPixels;
int densityDpi = displayMetrics.densityDpi;
float density = displayMetrics.density;
float scaledDensity = displayMetrics.scaledDensity;
- 使用 WindowManager(推荐,API 30+)
// 在 Activity 中
WindowManager windowManager = getWindowManager();
int screenWidth, screenHeight;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
WindowMetrics windowMetrics = windowManager.getCurrentWindowMetrics();
Rect bounds = windowMetrics.getBounds();
screenWidth = bounds.width();
screenHeight = bounds.height();
} else {
DisplayMetrics displayMetrics = new DisplayMetrics();
windowManager.getDefaultDisplay().getMetrics(displayMetrics);
screenWidth = displayMetrics.widthPixels;
screenHeight = displayMetrics.heightPixels;
}
- 获取包含系统UI的真实屏幕尺寸
public Point getRealScreenSize(Context context) {
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
Point size = new Point();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
display.getRealSize(size);
} else {
display.getSize(size); // 注意:此方法不包含某些系统装饰区域
}
return size;
}
// 使用
Point screenSize = getRealScreenSize(this);
int screenWidth = screenSize.x;
int screenHeight = screenSize.y;
- 获取可用显示区域(排除状态栏/导航栏)
// 在 Activity 中
public Rect getUsableScreenSize() {
Rect rect = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
return rect;
}
// 使用
Rect usableRect = getUsableScreenSize();
int usableWidth = usableRect.width();
int usableHeight = usableRect.height();
int statusBarHeight = usableRect.top; // 状态栏高度
- 获取当前窗口尺寸
public Point getCurrentWindowSize() {
Point size = new Point();
getWindowManager().getDefaultDisplay().getSize(size);
return size;
}
- 像素与DP转换工具方法
public class DisplayUtils {
/**
* 将dp值转换为px值
*/
public static int dpToPx(Context context, float dp) {
float density = context.getResources().getDisplayMetrics().density;
return Math.round(dp * density);
}
/**
* 将px值转换为dp值
*/
public static int pxToDp(Context context, float px) {
float density = context.getResources().getDisplayMetrics().density;
return Math.round(px / density);
}
/**
* 将sp值转换为px值
*/
public static int spToPx(Context context, float sp) {
float scaledDensity = context.getResources().getDisplayMetrics().scaledDensity;
return Math.round(sp * scaledDensity);
}
/**
* 获取状态栏高度
*/
public static int getStatusBarHeight(Activity activity) {
Rect rectangle = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rectangle);
return rectangle.top;
}
/**
* 获取导航栏高度
*/
public static int getNavigationBarHeight(Context context) {
int resourceId = context.getResources()
.getIdentifier("navigation_bar_height", "dimen", "android");
if (resourceId > 0) {
return context.getResources().getDimensionPixelSize(resourceId);
}
return 0;
}
}
- 在正确时机获取屏幕尺寸
public class MainActivity extends AppCompatActivity {
private int screenWidth, screenHeight;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 不要在 onCreate 中立即获取,此时窗口可能还没准备好
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
// 此时窗口已完全初始化,可以安全获取屏幕尺寸
getScreenSize();
}
}
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// 屏幕方向变化时重新获取尺寸
getScreenSize();
}
private void getScreenSize() {
WindowManager windowManager = getWindowManager();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
WindowMetrics windowMetrics = windowManager.getCurrentWindowMetrics();
Rect bounds = windowMetrics.getBounds();
screenWidth = bounds.width();
screenHeight = bounds.height();
} else {
DisplayMetrics displayMetrics = new DisplayMetrics();
windowManager.getDefaultDisplay().getRealMetrics(displayMetrics);
screenWidth = displayMetrics.widthPixels;
screenHeight = displayMetrics.heightPixels;
}
Log.d("ScreenSize", "Width: " + screenWidth + ", Height: " + screenHeight);
}
/**
* 获取屏幕信息
*/
public void printScreenInfo() {
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int widthPixels = displayMetrics.widthPixels;
int heightPixels = displayMetrics.heightPixels;
float density = displayMetrics.density;
int densityDpi = displayMetrics.densityDpi;
float scaledDensity = displayMetrics.scaledDensity;
// 屏幕尺寸分类
int screenSize = getResources().getConfiguration().screenLayout
& Configuration.SCREENLAYOUT_SIZE_MASK;
String screenSizeType = "Unknown";
switch (screenSize) {
case Configuration.SCREENLAYOUT_SIZE_SMALL:
screenSizeType = "Small";
break;
case Configuration.SCREENLAYOUT_SIZE_NORMAL:
screenSizeType = "Normal";
break;
case Configuration.SCREENLAYOUT_SIZE_LARGE:
screenSizeType = "Large";
break;
case Configuration.SCREENLAYOUT_SIZE_XLARGE:
screenSizeType = "XLarge";
break;
}
Log.d("ScreenInfo", "Screen: " + widthPixels + "x" + heightPixels);
Log.d("ScreenInfo", "Density: " + density + " (" + densityDpi + " dpi)");
Log.d("ScreenInfo", "Size type: " + screenSizeType);
}
}
- 获取屏幕方向相关尺寸
public class ScreenUtils {
/**
* 获取当前方向的屏幕尺寸
*/
public static Point getCurrentOrientationSize(Activity activity) {
Display display = activity.getWindowManager().getDefaultDisplay();
Point size = new Point();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
display.getRealSize(size);
} else {
display.getSize(size);
}
return size;
}
/**
* 判断当前是横屏还是竖屏
*/
public static boolean isLandscape(Context context) {
int orientation = context.getResources().getConfiguration().orientation;
return orientation == Configuration.ORIENTATION_LANDSCAPE;
}
/**
* 获取屏幕方向
*/
public static int getOrientation(Context context) {
return context.getResources().getConfiguration().orientation;
}
}
注意事项
- 生命周期时机:确保在 onWindowFocusChanged() 或视图已布局完成后再获取
- 方向变化:处理屏幕旋转时的尺寸变化
- 多窗口模式:在分屏模式下,应用可能只占据部分屏幕
- 折叠屏设备:需要考虑屏幕展开/折叠时的尺寸变化
简单示例:快速获取
// 最简单的方法
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int width = dm.widthPixels;
int height = dm.heightPixels;
Log.d("Screen", "Size: " + width + "x" + height);
选择哪种方法取决于你的具体需求:
• 需要真实屏幕尺寸(包含状态栏/导航栏):使用 getRealSize()
• 需要可用区域尺寸:使用 getWindowVisibleDisplayFrame()
• 兼容旧版本:使用 DisplayMetrics
• 新项目(API 30+):使用 WindowMetrics