OpenGL ES表面大小,隐藏的Android软件导航栏,以及Google Play游戏



我最近意识到我应该在Android应用程序中隐藏导航栏并使用沉浸式模式。我遇到了一个棘手的问题,OpenGL曲面是在Google Play Games的自动登录过程中创建的。在此过程中,导航栏仍然可见,GLSurfaceView会自行调整大小以说明这一点,在导航栏消失后,屏幕底部会留下一个黑条。我使用的是谷歌提供的BaseGameUtils包,这意味着我的基础Activity从所述包扩展了BaseGameActivity类,因此在运行任何代码之前都要运行超类构造函数。因此,我发现自己无法确保在登录过程开始之前创建OpenGL ES曲面。这意味着,即使我在自己的Activity类的onCreate()中设置了Window标志SYSTEM_UI_FLAG_HIDE_NAVIGATIONSYSTEM_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.

相关内容

最新更新