[Android] Android 15 대응 - EdgeToEdge: 4. 디스플레이 컷아웃

컷아웃

⚠️ 픽셀 기기에서는 컷아웃이 제대로 넘어오지 않는 것 같음. 카메라가 있는데도 컷아웃이 0으로 내려옴.

Android 9 이상을 실행하는 기기에서는 일관성, 앱 호환성을 보장하기 위해 다음과 같은 컷아웃 동작을 보장해야 한다.

  • 단일 가장자리에 컷아웃을 최대 1개 포함할 수 있다.
  • 기기에 컷아웃이 3개 이상 있을 수 없다.
  • 기기 양 쪽의 긴 가장자리(세로 모드 시 좌우)에는 컷아웃이 있을 수 없다.
  • 특수 플래그를 설정하지 않은 세로 방향에서는 상태 표시줄이 적어도 컷아웃 높이까지 확장되어야 한다.
  • 기본적으로 전체 화면 또는 가로 방향에서는 전체 컷아웃 영역이 레터박스 처리되어야 한다.

따라서, 다음과 같은 컷아웃 유형을 지원한다.

  • 상단 중앙: 상단 가장자리 중앙의 컷아웃
  • 상단 비중앙: 컷아웃이 모서리에 위치하거나 중앙에서 약간 벗어날 수 있다.
  • 하단: 하단의 컷아웃
  • 이중: 상단의 컷아웃 1개, 하단의 컷아웃 1개

콘텐츠가 컷아웃 영역과 겹치지 않게 하려면 콘텐츠가 스테이터스 바 및 네비게이션 바와 겹치지 않게 하려면 컷아웃 영역에서 Inset을 부여하여 처리하면 해결이 가능하다.

컷아웃 영역으로 렌더링하는 경우 WindowInsets#getDisplayCutout() 함수를 사용하여 각 컷아웃의 Safe Inset Area와 Safe Area가 포함된 DisplayCutout 객체를 탐색할 수 있다. 따라서 이러한 API를 사용해 콘텐츠가 컷아웃과 겹치는지 여부를 판단하여 위치를 조정할 수 있다.

아래 세 가지 옵션은 Android 15(API 35)에서 deprecated된 View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION를 사용할 경우 유효한 옵션이다.

Android 15(API 35)부터는 WindowInsets#getDisplayCutout() 함수를 사용하면 된다.

컷아웃 영역은 카메라와 같은 하드웨어가 디스플레이를 가리는 경우 생긴다.
관련 예로, 폰에서 카메라 영역(컷아웃 영역) 때문에 상단 인셋을 적용했는데, 이 코드를 컷아웃 영역이 없는 태블릿에서 실행하니 컷아웃 영역이 없는데도 상단 인셋이 적용되어 버린다.
따라서 아래와 같이 컷아웃을 사용해 패딩을 설정하면 컷아웃에 따른 인셋을 설정할 수 있게 된다.

1
2
3
4
5
6
ViewCompat.setOnApplyWindowInsetsListener(findViewById(android.R.id.content)) { view, insets ->
insets.displayCutout?.let {
view.setPadding(0, it.safeInsetTop, 0, 0)
}
insets
}

[Android] Android 15 대응 - EdgeToEdge: 4. 디스플레이 컷아웃

https://dl137584.github.io/2025/06/25/036-android15-edge-to-edge-03-display-cutout/

Author

LEEJS

Posted on

2025-06-25

Updated on

2026-01-10

Licensed under

댓글