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

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

Рисунок 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 для временного отображения скрытых системных панелей с помощью системных жестов, таких как смахивание от края экрана, где панель скрыта. Эти временные системные панели накладываются на содержимое вашего приложения, могут иметь некоторую степень прозрачности и автоматически скрываются после короткого тайм-аута.