Я ломал голову всю неделю, пытаясь что-то повернуть налево и направо, и я не могу найти ответ. У меня могло бы быть больше вопросов.
У нас есть приложение, которое использует представление Unity в одном из своих действий для представления некоторой графики. Поскольку это обычное приложение, а не игра, мы хотим убрать режим погружения и полноэкранный режим, чтобы можно было вернуться к системным панелям (статус и навигация)
Теперь, начиная с последних версий Unity, они добавили опцию Start in fullscreen mode
в настройках плеера для Android. Проблема в том, что вышеупомянутая опция возвращает только панель навигации.
Следующим шагом было попытаться вернуться с некоторой нативной кодировкой 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());
}
и при определенных обстоятельствах черная полоса аналогичного размера появляется над графической областью.
Наконец, когда появляются черные полосы, собственный интерфейс также ломается. Для нижней панели должен быть какой-то инструмент, который подталкивается туда, где фактически начинается графика. Нижняя черная полоса является частью UnityPlayer, поскольку прикосновение к ней может вызвать взаимодействие с графикой. Верхний бар, когда он там, еще более странный. Эта область на самом деле там, где должна быть и в каком-то смысле родная панель инструментов. Это не видно, но касание там вызывает события пользовательского интерфейса !!! Похоже, что представление Unity не может правильно расположиться, когда оно не в полноэкранном режиме, так как Native UI изначально отображается правильно, но когда включается Unity, все становится странно. Чтобы обратить внимание еще раз. Это происходит только в высоких устройствах аспекта. Устройства 16: 9, похоже, не имеют проблем.
Итак, главный вопрос: как вывести приложение из полноэкранного режима, чтобы строка состояния отображалась и не нарушала рендеринг Unity в высоких аспектах?