Скрыть системные панели для режима погружения

Некоторый контент лучше всего просматривать в полноэкранном режиме без каких-либо индикаторов в строке состояния или панели навигации. Некоторые примеры: видео, игры, галереи изображений, книги и слайды презентаций. Это называется режимом погружения . На этой странице показано, как можно более глубоко заинтересовать пользователей контентом в полноэкранном режиме.

Рисунок 1. Пример режима погружения.

Режим погружения помогает пользователям избегать случайных выходов во время игры и обеспечивает захватывающий опыт просмотра изображений, видео и книг. Однако помните, как часто пользователи заходят в приложения и выходят из них, чтобы проверить уведомления, выполнить импровизированный поиск или выполнить другие действия. Поскольку режим погружения приводит к тому, что пользователи теряют легкий доступ к навигации по системе, используйте режим погружения только тогда, когда польза от взаимодействия с пользователем выходит за рамки простого использования дополнительного места на экране.

Используйте WindowInsetsControllerCompat.hide() , чтобы скрыть системные панели, и WindowInsetsControllerCompat.show() чтобы вернуть их обратно.

В следующем фрагменте показан пример настройки кнопки для скрытия и отображения системных панелей.

override fun onCreate(savedInstanceState: Bundle?) {
   
...

   
val windowInsetsController =
       
WindowCompat.getInsetsController(window, window.decorView)
   
// Configure the behavior of the hidden system bars.
    windowInsetsController
.systemBarsBehavior =
       
WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE

   
// Add a listener to update the behavior of the toggle fullscreen button when
   
// the system bars are hidden or revealed.
   
ViewCompat.setOnApplyWindowInsetsListener(window.decorView) { view, windowInsets ->
       
// You can hide the caption bar even when the other system bars are visible.
       
// To account for this, explicitly check the visibility of navigationBars()
       
// and statusBars() rather than checking the visibility of systemBars().
       
if (windowInsets.isVisible(WindowInsetsCompat.Type.navigationBars())
           
|| windowInsets.isVisible(WindowInsetsCompat.Type.statusBars())) {
            binding
.toggleFullscreenButton.setOnClickListener {
               
// Hide both the status bar and the navigation bar.
                windowInsetsController
.hide(WindowInsetsCompat.Type.systemBars())
           
}
       
} else {
            binding
.toggleFullscreenButton.setOnClickListener {
               
// Show both the status bar and the navigation bar.
                windowInsetsController
.show(WindowInsetsCompat.Type.systemBars())
           
}
       
}
       
ViewCompat.onApplyWindowInsets(view, windowInsets)
   
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
   
...

   
WindowInsetsControllerCompat windowInsetsController =
           
WindowCompat.getInsetsController(getWindow(), getWindow().getDecorView());
   
// Configure the behavior of the hidden system bars.
    windowInsetsController
.setSystemBarsBehavior(
           
WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
   
);

   
// Add a listener to update the behavior of the toggle fullscreen button when
   
// the system bars are hidden or revealed.
   
ViewCompat.setOnApplyWindowInsetsListener(
        getWindow
().getDecorView(),
       
(view, windowInsets) -> {
       
// You can hide the caption bar even when the other system bars are visible.
       
// To account for this, explicitly check the visibility of navigationBars()
       
// and statusBars() rather than checking the visibility of systemBars().
       
if (windowInsets.isVisible(WindowInsetsCompat.Type.navigationBars())
               
|| windowInsets.isVisible(WindowInsetsCompat.Type.statusBars())) {
            binding
.toggleFullscreenButton.setOnClickListener(v -> {
               
// Hide both the status bar and the navigation bar.
                windowInsetsController
.hide(WindowInsetsCompat.Type.systemBars());
           
});
       
} else {
            binding
.toggleFullscreenButton.setOnClickListener(v -> {
               
// Show both the status bar and the navigation bar.
                windowInsetsController
.show(WindowInsetsCompat.Type.systemBars());
           
});
       
}
       
return ViewCompat.onApplyWindowInsets(view, windowInsets);
   
});
}

При желании вы можете указать тип системных панелей, которые нужно скрыть, и определить их поведение при взаимодействии с ними пользователя.

Укажите, какие системные панели следует скрыть

Чтобы указать тип системных панелей, которые нужно скрыть, передайте один из следующих параметров в WindowInsetsControllerCompat.hide() .

Укажите поведение скрытых системных панелей

Используйте WindowInsetsControllerCompat.setSystemBarsBehavior() чтобы указать, как ведут себя скрытые системные панели, когда пользователь взаимодействует с ними.

  • Используйте WindowInsetsControllerCompat.BEHAVIOR_SHOW_BARS_BY_TOUCH чтобы отображать скрытые системные панели при любых взаимодействиях пользователя на соответствующем дисплее.

  • Используйте WindowInsetsControllerCompat.BEHAVIOR_SHOW_BARS_BY_SWIPE чтобы отображать скрытые системные панели при любых системных жестах, например при проведении от края экрана, где панель скрыта.

  • Используйте WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE чтобы временно отобразить скрытые системные панели с помощью системных жестов, например, проведя пальцем от края экрана, с которого панель скрыта. Эти временные системные панели накладываются на содержимое вашего приложения, могут иметь некоторую степень прозрачности и автоматически скрываются по истечении короткого времени ожидания.