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
相关产品推荐
相关产品推荐

