【发布时间】:2019-06-03 06:49:06
【问题描述】:
我已经绞尽脑汁一个星期了,现在左右尝试,我似乎找不到答案。我实际上可能还有更多问题。
我们有一个应用程序,它在其中一个活动中使用 Unity 视图来呈现一些图形。由于这是一个普通的应用程序而不是游戏,我们想要移除沉浸式模式和全屏模式,以便我们可以恢复系统栏(状态和导航)
现在自从最新版本的 Unity 开始,他们在 Android 的播放器设置中添加了Start in fullscreen mode 选项。问题是上面的选项只带回了导航栏。
下一步是尝试使用一些原生 Android 编码恢复原状。所以基本上是这样的:
this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
完成工作并带回状态栏。
在我使用高宽比 (18.5:9 - Pixel 3 XL - Android 9) 设备之前,这就像一个魅力。
如果我简单地使用 Unity 全屏选项,图形可以很好地缩放,但我没有状态栏,这对于有缺口的手机来说更加明显:
如果我从 Android 中删除全屏标志,我会恢复状态栏,但渲染会中断:
??? 是出现的黑色区域。
抱歉,我无法向您展示实际的应用程序。
现在,我玩弄了所谓的“沉浸式模式”的其他标志:
// When init of Unity
this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
this.showSystemUi();
this.addUiVisibilityChangeListener();
// What the above does
private static int getLowProfileFlag() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT ? View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |
View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_FULLSCREEN : View.SYSTEM_UI_FLAG_LOW_PROFILE;
}
private void showSystemUi() {
this.mUnityPlayer.setSystemUiVisibility(this.mUnityPlayer.getSystemUiVisibility() & ~getLowProfileFlag());
}
private void addUiVisibilityChangeListener() {
this.mUnityPlayer.setOnSystemUiVisibilityChangeListener(visibility -> RadarOverviewActivity.this.showSystemUi());
}
在某些情况下,图形区域上方会出现一个类似大小的黑条。
最后,当黑条出现时,原生 UI 也会中断。对于底部栏,应该有一些工具可以在图形实际开始的地方向上推。底部的黑条是 UnityPlayer 的一部分,因为触摸那里实际上会导致与图形的交互。顶栏,当它在那里时,就更奇怪了。该区域实际上是本机工具栏应该在的地方,并且在某种程度上是。看不到,但触摸那里会触发 UI 事件!!!看起来 Unity 视图在非全屏时无法正确放置,因为 Native UI 最初显示正确,但当 Unity 启动时变得很奇怪。再次指出关注点。这仅发生在高纵横比设备中。 16:9 的设备似乎没有问题。
所以主要的问题是,如何让应用退出全屏模式,同时显示状态栏而不破坏 Unity 在高方面的渲染?
【问题讨论】:
标签: android unity3d android-fullscreen android-immersive