我最近意识到我应该在Android应用程序中隐藏导航栏并使用沉浸式模式。我遇到了一个棘手的问题,OpenGL曲面是在Google Play Games的自动登录过程中创建的。在此过程中,导航栏仍然可见,GLSurfaceView
会自行调整大小以说明这一点,在导航栏消失后,屏幕底部会留下一个黑条。我使用的是谷歌提供的BaseGameUtils包,这意味着我的基础Activity
从所述包扩展了BaseGameActivity
类,因此在运行任何代码之前都要运行超类构造函数。因此,我发现自己无法确保在登录过程开始之前创建OpenGL ES曲面。这意味着,即使我在自己的Activity
类的onCreate()
中设置了Window
标志SYSTEM_UI_FLAG_HIDE_NAVIGATION
和SYSTEM_UI_FLAG_IMMERSIVE_STICKY
,在登录过程中仍然会显示导航栏。我也尝试过更改BaseGameActivity
中的标志,但没有成功;我相当确定问题在于出现的各种弹出窗口,这些弹出窗口似乎直接来自GoogleApiClient
,我无法修改它们。
完全重新创建GLSurfaceView
,例如按下主页按钮,然后返回应用程序,可以正确设置Surface
的大小。然而,要做到这一点,需要完全重新加载所有纹理,这在应用程序启动后是不可能的。我正在寻找解决方案,要么允许我:
- 在Google Play Games登录过程开始之前创建
GLSurfaceView
。我不确定这是否可能,但如果有人有相反的经验,应该会完全解决这个问题 - 触发
GLSurfaceView
的"重置",使其无需重新加载纹理即可调整自身大小,或者 - 完全阻止
BaseGameUtils
程序包显示导航栏
当然,其他解决方案也是受欢迎的。
它可能无法解决您的所有问题,但您肯定可以摆脱BaseGameActivity和BaseGameUtils。有一个关于这一变化的信息视频:Game On!-BaseGameActivity的死亡。建议的方法是让您的活动(或ActivityFragment)实现连接所需的2个接口:GoogleApiClient.ConnectionCallbacks、GoogleApiCClient.OnConnectionFailedListener.
TypeANumber示例是一个很好的模型。
这将使您能够毫无问题地集成所有初始化代码和登录处理。
就在登录过程之前创建GLSurfaceView而言,这应该是可以的。一旦您的视图初始化并且游戏准备就绪,您就可以调用GoogleAPIClient.connect()来启动该过程。
如果您完全熟悉C++,您可以浏览使用OpenGL和Play game Services的C++基本游戏示例的代码:https://github.com/playgameservices/cpp-android-basic-samples.