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

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

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

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

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

В следующем фрагменте кода показано, как настроить кнопку, чтобы скрывать и показывать системные строки.

Kotlin

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)
    }
}

Java

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