현재 프로젝트를 새롭게 생성하면 기본적으로 enableEdgeToEdge()가 적용되어 있습니다.
xml 기반으로 생성될 때는 다음 코드로 인해 기본적으로 패딩이 설정됩니다.
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
하지만 Compose는 별다른 패딩을 설정해주지 않기 때문에 UI가 시스템 영역을 침범하는 모습을 볼 수 있습니다.
전체 배경을 회색으로 설정하고 하단에 녹색 박스를 배치했을 때 UI에 따라 시스템 영역에 색상이 적용된 것을 확인할 수 있습니다.
시스템 영역에 UI가 침범하는 것을 방지하고자 한다면 우선 WindowInsets 종류에 대해 알아야 합니다.
WindowInsets Type
- captionBar: 자막 바 영역, 안드로이드 API 30부터 추가된 기능, 안드로이드 10부터 추가된 자막영역에 대해 Inset에 대한 영역
- displayCutout: 스마트폰 상단이나 하단에 위치한 노치, 펀치홀 카메라 영역
- ime: 키보드 입력 영역
- mandatorySystemGestures: 사용자가 기기에서 기본적인 작업을 수행하도록 돕는 시스템 제스처의 하위 집합 ex) 홈, 뒤로 가기 등
- navigationBars: 네비게이션 바 영역
- statusBar: 상태표시줄 영역
- systemBar: 기기 화면의 상단이나 하단에 위치한 영역, 사용자가 시스템 기능에 액세스하고 앱을 제어하는 데 도움이 되는 버튼과 정보를 제공
- systemGestures: 사용자가 기기에서 기본적인 작업을 수행하도록 돕는 제스처의 모음 ex) 음량 조절 제스처, 스크린샷 캡처 제스처 등
- systemOverlays: 시스템 UI 요소 (예: 상태바, 네비게이션 바) 위에 표시되는 추가 레이어 ex) 알림 및 HUD 표시, 화면 어둡게 하기
- tappableElement: 사용자가 화면을 터치하여 상호 작용할 수 있는 영역을 정의 ex) 뷰, 레이아웃
WindowInsets padding 종류
안드로이드에서 제공되는 큰 묶음의 종류는 3가지가 있습니다.
- safeDrawing
- safeGestures
- safeContent
safeDrawing systemBars에 키보드와 컷아웃을 포함시킨 형태입니다.
```kotlin
val safeDrawing = systemBars.union(ime).union(displayCutout)
```
safeGestures tappableElement에 필수 시스템 제스처, 시스템 제스처, waterfall이 포함됩니다.
```kotlin
val waterfall =
ValueInsets(insets?.displayCutout?.waterfallInsets ?: AndroidXInsets.NONE, "waterfall")
val safeGestures: WindowInsets =
tappableElement.union(mandatorySystemGestures).union(systemGestures).union(waterfall)
```
safeContent 전체 WindowInsets에 대한 묶음입니다.
```kotlin
val safeContent: WindowInsets = safeDrawing.union(safeGestures)
```
안드로이드에서는 WindowInsets에 대한 padding을 각각 설정하거나 비슷한 부류를 묶어서 제공합니다.
```kotlin
Column(
modifier = Modifier
.fillMaxSize()
.systemBarsPadding()
.waterfallPadding()
)
```
결론
safeDrawingPadding()을 적용하면 게시글 첫 이미지의 문제점을 개선할 수 있습니다.
```kotlin
Column(
modifier = Modifier
.fillMaxSize()
.safeContentPadding()
)
반응형
'Android' 카테고리의 다른 글
OkHttp Authenticator (0) | 2024.09.05 |
---|---|
OkHttp Interceptor란 무엇일까? 어떻게 사용할 수 있지? (0) | 2024.09.03 |
[Android] Compose onGloballyPositioned - bounds 속성들 (1) | 2024.06.30 |
[Android] Material3 Color 속성 정리 (1) | 2024.06.29 |
[Android] Compose 키보드 영역에 따른 패딩 적용 방법 (imePadding) (0) | 2024.06.27 |
댓글