О вырезках

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

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

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

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

Дело по умолчанию

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

Приложения, предназначенные для устройств с Android 15 или более поздней версии и поддерживающие уровень API 35 или выше, а также объекты 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 для неплавающих окон в приложениях, предназначенных для устройств с Android 15 или более поздней версии и целевым уровнем API 35 или выше.

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

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

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

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