Вырезы в Compose

Вырез дисплея — это область на некоторых устройствах, которая выходит за пределы поверхности дисплея. Он обеспечивает удобство работы от края до края , обеспечивая при этом место для важных датчиков на передней панели устройства.

Пример выреза в портретном режиме
Рисунок 1 . Пример выреза в портретном режиме
Пример выреза в ландшафтном режиме
Рисунок 2 . Пример выреза в ландшафтном режиме

Android поддерживает вырезы дисплея на устройствах под управлением Android 9 (уровень API 28) и выше. Однако производители устройств также могут поддерживать вырезы дисплея на устройствах под управлением Android 8.1 или более ранней версии.

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

Случай по умолчанию

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

Например, когда вы используете Modifier.windowInsetsPadding(WindowInsets.safeContent) или Modifier.windowInsetsPadding(WindowInsets.safeDrawing) , ваше приложение автоматически не будет рисовать в областях, где находится вырез. WindowInsets.safeContent и WindowInsets.safeDrawing содержат информацию о вырезе дисплея и не будут рисовать там, где находится вырез устройства.

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

    WindowCompat.setDecorFitsSystemWindows(window, false)

    setContent {
        Box(Modifier.windowInsetsPadding(WindowInsets.safeContent)) {
            // Any composable inside here will avoid drawing behind cutouts
        }
    }
}

Чтобы дополнительно настроить это поведение, вам необходимо самостоятельно обработать информацию о вырезе.

Обработка информации о вырезе вручную

Обработать вырезы можно любым из следующих способов:

Для Compose рекомендуется установить для windowLayoutInDisplayCutoutMode значение по default в вашей общей теме, а затем использовать WindowInsets.displayCutout для обработки вставок в ваших составных объектах:

Canvas(modifier = Modifier.fillMaxSize().windowInsetsPadding(WindowInsets.displayCutout)) {
    drawRect(Color.Red, style = Stroke(2.dp.toPx()))
}

Этот подход позволяет вам учитывать заполнение displayCutout там, где это необходимо, или игнорировать его там, где оно не требуется.

Альтернативно вы можете применить те же настройки, которые описаны в документации Views Cutout , установив для темы действия android:windowLayoutInDisplayCutoutMode другой параметр или установив атрибут окна с помощью window.attributes.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT . Однако затем режим отключения применяется ко всему действию и не может управляться для каждого отдельного компонента.

Чтобы соблюдать вырез дисплея в некоторых составных объектах, но не в других, используйте WindowInset.displayCutout . Этот API позволяет вам получить доступ к информации о вырезе, когда это необходимо.

Лучшие практики

При работе с вырезами для дисплея учитывайте следующее:

  • Помните о размещении важных элементов пользовательского интерфейса. Не позволяйте области выреза закрывать важный текст, элементы управления или другую информацию.
  • Не размещайте и не расширяйте какие-либо интерактивные элементы, требующие тонкого распознавания, в области выреза. Чувствительность к прикосновению может быть ниже в области выреза.
  • При следовании указаниям от края до края информация о вырезе включается во вставки safeDrawing / safeContent .
  • Там, где это возможно, используйте Modifier.windowInsetsPadding(WindowInsets.safeDrawing) чтобы определить подходящее дополнение для применения к вашему содержимому. Избегайте жесткого кодирования высоты строки состояния, так как это может привести к перекрытию или обрезке содержимого.

Проверьте, как ваш контент отображается с вырезами

Обязательно протестируйте все экраны и возможности вашего приложения. Если возможно, протестируйте устройства с разными типами вырезов. Если у вас нет устройства с вырезом, вы можете смоделировать распространенные конфигурации выреза на любом устройстве или эмуляторе под управлением Android 9 или более поздней версии, выполнив следующие действия:

  1. Включите параметры разработчика .
  2. На экране «Параметры разработчика» прокрутите вниз до раздела «Рисование» и выберите «Имитировать дисплей с вырезом» .
  3. Выберите тип выреза.
    имитация выреза дисплея в эмуляторе
    Рисунок 3 . Используйте параметры разработчика , чтобы проверить, как отображается ваш контент.
{% дословно %} {% дословно %} {% дословно %} {% дословно %}