Informacje o wycinkach

Wycięcie w ekranie to obszar na niektórych urządzeniach, który wchodzi w powierzchnię wyświetlacza. Umożliwia to wyświetlanie treści od krawędzi do krawędzi, a jednocześnie zapewnia miejsce na ważne czujniki z przodu urządzenia.

Przykład wycięcia w trybie portretowym
Rysunek 1. Przykład wycięcia w trybie portretowym
Przykład wycięcia w trybie poziomym
Rysunek 2. Przykład wycięcia w trybie poziomym

Android obsługuje wycięcia w ekranie na urządzeniach z Androidem 9 (poziom interfejsu API 28) lub nowszym. Producenci urządzeń mogą jednak obsługiwać wycięcia na wyświetlaczu również na urządzeniach z Androidem 8.1 lub starszym.

Na tej stronie opisujemy, jak wdrożyć obsługę urządzeń z wycięciami w Compose, w tym jak pracować z obszarem wycięcia, czyli prostokątem od krawędzi do krawędzi na powierzchni wyświetlacza, który zawiera wycięcie.

Przypadek domyślny

Aplikacje kierowane na docelowy poziom interfejsu API 34 lub niższym oraz Activity, które nie wywołują metody enableEdgeToEdge, nie będą domyślnie rysować w obszarze wycięcia w ekranie, chyba że aplikacja rysuje w pasku systemu zawierającym wycięcie w ekranie.

Aplikacje kierowane na interfejs API na poziomie 35 lub wyższym na urządzeniach z Androidem 15 lub nowszym oraz aktywności, które wywołują enableEdgeToEdge, rysują w obszarze wycięcia.

Innymi słowy, LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT, LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES i LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER są interpretowane jako LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS w przypadku okien niepływających w aplikacjach kierowanych na poziom interfejsu API 35 lub wyższy na urządzeniach z Androidem 15 lub nowszym.

Ręczne obsługiwanie informacji o wycięciu

Musisz obsługiwać informacje o wycięciu, aby zapobiec zasłanianiu przez nie ważnego tekstu, elementów sterujących lub elementów interaktywnych, które wymagają precyzyjnego rozpoznawania dotyku (czułość na dotyk może być niższa w obszarze wycięcia). Podczas obsługi wycięć nie koduj na stałe wysokości paska stanu, ponieważ może to spowodować nakładanie się lub obcinanie treści. Zamiast tego obsługuj wycięcia na jeden z tych sposobów:

W przypadku Compose zalecamy używanie displayCutout, safeContent lub safeDrawing do obsługi wcięć wycięcia w komponentach. Dzięki temu możesz uwzględnić dopełnienie wycięcia w ekranie tam, gdzie jest to wymagane, lub zignorować je tam, gdzie nie jest to konieczne.

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