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

相关推荐
用户86022504674721 小时前
Kotlin 函数式编程入门与实践指南
android
最爱睡觉睡觉睡觉3 小时前
CSS → Flutter 对照手册
android·前端
xingpanvip3 小时前
星盘接口开发文档:马盘次限盘接口指南
android·开发语言·python·php·lua
用户26190498561574 小时前
JUnit4 完整配置流程
android
用户26190498561574 小时前
JaCoCo 完整配置流程
android
QING6185 小时前
Android面试 —— 八股文之app启动流程
android·面试·app
海鸥-w5 小时前
python(fastapi) 实现更新,新增,删除接口
android·python·fastapi
le1616165 小时前
Android Compose Modifier修饰符
android·compose·modifier
黄林晴5 小时前
Android17新规:内存超限直接杀App,没有崩溃日志怎么排查?
android