О вырезках

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

Пример выреза в режиме портретной съемки
Рисунок 1. Пример выреза в режиме портретной съемки
Пример выреза в горизонтальном режиме
Рисунок 2. Пример выреза в горизонтальном режиме

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

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

Вариант по умолчанию

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

Приложения, поддерживающие целевой уровень API 35 или выше на устройствах с Android 15 или более поздней версии, а также Activity, вызывающие enableEdgeToEdge, могут использовать область выреза.

Другими словами, LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT, LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES и LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER интерпретируются как LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS для неплавающих окон в приложениях с целевым уровнем API 35 или выше на устройствах с Android 15 или более поздней версией.

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

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

Для Compose мы рекомендуем использовать displayCutout, safeContent или safeDrawing для обработки вставок вырезов в ваших составных элементах. Этот подход позволяет учитывать отступы выреза на экране, когда это необходимо, или игнорировать их, когда они не требуются.

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