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

相关推荐
齊家治國平天下1 小时前
Android 14 Vehicle HAL (VHAL) 设计与实现深度解析
android·aaos·carservice·车载开发·android 14·vhal·vehicle hal
条tiao条6 小时前
Navigation页面跳转教学博客
ui·华为·harmonyos·鸿蒙·页面跳转
AFinalStone7 小时前
Android 7系统网络(八)应用API层—ConnectivityManager使用与实战调试
android·网络
plainGeekDev7 小时前
kapt 替换为 KSP
android·java·kotlin
蜡台8 小时前
通过Gradle脚本声明更改Java变量
android·java·开发语言·python·kotlin·gradle·groovy
এ慕ོ冬℘゜9 小时前
前端实战:Textarea 实时字数计数输入器(带字数限制+UI优化完整源码)
前端·ui
阿pin11 小时前
Android随笔-SharedPreferences
android·sp
阿pin11 小时前
Android随笔-DataStore
android·datastore
茶栀(*´I`*)12 小时前
Android 测试入门指南:ADB 基础配置与常用设备管理命令解析
android·adb
ihuyigui13 小时前
海外酒店预订短信接口
android·java·运维·服务器·前端·后端·架构