You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android全屏应用获取屏幕宽高异常:顶部黑边底部偏移求助

Android全屏应用屏幕尺寸获取异常(黑边/偏移)的解决办法

问题场景

在Android全屏应用中使用以下代码获取屏幕尺寸时,部分设备出现顶部黑边、底部屏幕偏移的问题,排除硬件因素,其他应用可正常全屏显示:

DisplayMetrics displayMetrics = new DisplayMetrics();
               
getWindowManager().getDefaultDisplay().getRealMetrics(displayMetrics);
int height = displayMetrics.heightPixels;
int width = displayMetrics.widthPixels;
float density = displayMetrics.density;

WIDTH = width/density;
HEIGHT = height/density;

可行解决办法

1. 确保应用完全进入全屏状态

尺寸计算异常常因全屏配置不完整导致,需从代码或配置层面确保系统UI完全隐藏:

  • 代码实现(在Activity的onCreate方法中添加):
getWindow().getDecorView().setSystemUiVisibility(
    View.SYSTEM_UI_FLAG_LAYOUT_STABLE
    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
    | View.SYSTEM_UI_FLAG_FULLSCREEN
    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
);
  • Manifest配置:在目标Activity标签内添加全屏主题:
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
<!-- 适配AppCompat库的主题 -->
android:theme="@style/Theme.AppCompat.Light.NoActionBar.Fullscreen"

2. 采用WindowInsets获取应用可用区域(Android 11+推荐)

getRealMetrics未考虑系统栏(状态栏、导航栏)的Insets影响,Android 11及以上可通过WindowInsets获取应用实际可用尺寸:

View decorView = getWindow().getDecorView();
decorView.setOnApplyWindowInsetsListener((v, insets) -> {
    // 计算去除系统栏后的可用高度
    int systemBarHeight = insets.getInsets(WindowInsets.Type.systemBars()).top + 
                          insets.getInsets(WindowInsets.Type.systemBars()).bottom;
    int realScreenHeight = getResources().getDisplayMetrics().heightPixels;
    HEIGHT = (realScreenHeight - systemBarHeight) / getResources().getDisplayMetrics().density;
    
    // 计算可用宽度
    int systemBarWidth = insets.getInsets(WindowInsets.Type.systemBars()).left + 
                         insets.getInsets(WindowInsets.Type.systemBars()).right;
    int realScreenWidth = getResources().getDisplayMetrics().widthPixels;
    WIDTH = (realScreenWidth - systemBarWidth) / getResources().getDisplayMetrics().density;
    
    return insets;
});

3. 适配异形屏(刘海/挖孔屏)

部分设备的异形屏会导致尺寸计算偏差,需添加适配配置并调整窗口布局:

  • Manifest配置:在<application>或<activity>标签下添加:
<meta-data android:name="android.max_aspect" android:value="2.1" />
<meta-data android:name="android.notch_support" android:value="true" />
  • 代码适配(Android P及以上):
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    WindowManager.LayoutParams lp = getWindow().getAttributes();
    // 允许窗口延伸至刘海区域
    lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
    getWindow().setAttributes(lp);
}

4. 延迟获取屏幕尺寸

避免在Activity生命周期早期(如onCreate)获取尺寸,此时窗口可能未完全初始化,建议在onWindowFocusChanged或onResume后执行:

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (hasFocus) {
        calculateScreenSize(); // 这里调用你的尺寸计算方法
    }
}

内容的提问来源于stack exchange,提问作者Paul Kocian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 10:51:31