API 27(Android 8.0)下GLSurfaceView全屏功能失效问题求助
解决Android 8.0(API27)上GLSurfaceView全屏顶部黑块问题
我之前也碰到过一模一样的坑!在Android 8.0及以上设备上用传统全屏代码设置后,GLSurfaceView顶部总是留着一块黑块,但API27以下的设备完全正常。先给大家还原下问题场景:
问题场景
我的布局文件是这样的:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/transparent" tools:context="ui.wearing.WearingActivity"> <GLSurfaceView android:id="@+id/camera_screen" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentTop="true"> </GLSurfaceView> </RelativeLayout>
最初的全屏实现代码是:
super.onCreate(savedInstanceState); // 移除标题 requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.webview_act);
这段代码在低版本系统上完全没问题,但到了Android 8.0,GLSurfaceView顶部就会出现黑块,没法真正铺满全屏。
问题原因
Android 8.0(API27)对窗口布局的逻辑做了调整,传统的FLAG_FULLSCREEN已经无法让内容完全延伸到状态栏原本的区域,系统会默认保留状态栏的占位空间,导致GLSurfaceView没法顶到屏幕最上方。
解决方案
试试更新你的全屏设置代码,加入FLAG_LAYOUT_NO_LIMITS,同时适配Android 8.0的窗口特性:
super.onCreate(savedInstanceState); // 分版本适配全屏设置 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); } else { requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); } // 让窗口布局不受系统栏限制,彻底铺满屏幕 getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); setContentView(R.layout.webview_act);
另外,也可以在Activity对应的主题里添加以下属性,从主题层面确保全屏效果:
<style name="FullScreenTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:windowFullscreen">true</item> <item name="android:windowContentOverlay">@null</item> <!-- 适配Android 8.0+的刘海屏/挖孔屏 --> <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item> </style>
这样调整后,GLSurfaceView应该就能在Android 8.0设备上正常全屏显示,顶部的黑块也会消失。
内容的提问来源于stack exchange,提问作者yuyushiki
相关产品推荐
相关产品推荐

