Android-UI-获取屏幕尺寸的方法

Android 获取屏幕尺寸的 Java 版本

以下是 Android 中获取屏幕尺寸的各种 Java 实现方法:

  1. 使用 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;

  1. 使用 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;

}

  1. 获取包含系统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;

  1. 获取可用显示区域(排除状态栏/导航栏)

// 在 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; // 状态栏高度

  1. 获取当前窗口尺寸

public Point getCurrentWindowSize() {

Point size = new Point();

getWindowManager().getDefaultDisplay().getSize(size);

return size;

}

  1. 像素与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;
}

}

  1. 在正确时机获取屏幕尺寸

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);
}

}

  1. 获取屏幕方向相关尺寸

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;
}

}

注意事项

  1. 生命周期时机:确保在 onWindowFocusChanged() 或视图已布局完成后再获取
  2. 方向变化:处理屏幕旋转时的尺寸变化
  3. 多窗口模式:在分屏模式下,应用可能只占据部分屏幕
  4. 折叠屏设备:需要考虑屏幕展开/折叠时的尺寸变化

简单示例:快速获取

// 最简单的方法

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

相关推荐
37手游移动客户端团队6 小时前
招聘-高级安卓开发工程师
android·客户端
用户41659673693556 小时前
WebView 请求异常排查操作手册
android·前端
Kapaseker7 小时前
学不动了,入门 Compose Styles API
android·kotlin
墨狂之逸才1 天前
Android TV WebView 遥控器按键处理:从全透传到白名单
android
plainGeekDev1 天前
MVC 写法 → MVVM
android·java·kotlin
恋猫de小郭1 天前
Flutter Patchwork,不用 Fork 改依赖包源码的第三方工具
android·前端·flutter
三少爷的鞋1 天前
“结构化”这个词,本质上就是——把混乱的东西变成有组织、有规则、有边界的东西
android
方白羽2 天前
Android Gradle 缓存与文件目录深度解析
android·gradle·android studio
曲幽2 天前
Termux里的二进制和脚本,到底怎么运行才不踩坑?Termux-service 保活妙招!
android·termux·nohup·services·wake-lock
plainGeekDev2 天前
单例模式 → object 声明
android·java·kotlin