기록
[GPT가 알려주는] 인셋(insets)이란? 본문
비디오 플레이어 전체화면으로 변경 시,
시스템 상단바, 하단 네비게이션 바를 없애면서
인셋을 공부하였다.
인셋(insets)이 뭐냐면…
화면 가장자리(상단 상태바, 하단 내비게이션바, 카메라 홀/노치 등) 때문에 앱이 실질적으로 쓸 수 없는 여백 영역의 크기를 말해.
안드로이드에선 이 값을 WindowInsets 라고 부르고, 시스템이 “지금 상태바가 몇 px, 내비바가 몇 px”처럼 알려줘. 그래서 우리는 그만큼 패딩/마진을 더하거나 빼서 화면이 잘리지 않게 배치해.
왜 필요해?
- 상태바가 24dp만큼 차지하면, 리스트 첫 아이템이 상태바 뒤로 숨지지 않도록 paddingTop = insetTop을 주는 식으로 레이아웃을 조정해야 함.
- 제스처 내비게이션 기기에서 하단 바 높이가 기기/상태마다 달라서 하드코딩이 위험 → 인셋으로 안전하게 처리.
핵심 개념 한 방에
- WindowInsets: 시스템이 알려주는 “가장자리 여백” 묶음(상/하/좌/우). 타입별로 나뉨
- Type.statusBars() : 상태바 영역
- Type.navigationBars() : 내비게이션바/제스처 영역
- Type.displayCutout() : 노치/펀치홀
- 그 외 IME(키보드), systemGestures 등
- decorFitsSystemWindows(window, true/false)
- true → 시스템이 인셋만큼 자동으로 컨텐츠 아래로 밀어줌(전통 방식)
- false → 개발자가 직접 인셋 받아서 패딩/마진 적용(요즘 권장, edge-to-edge)
- WindowInsetsController: 상태바/내비바 숨기거나 보이게 제어하는 컨트롤러 (풀스크린 토글)
실제 적용 예시 (edge-to-edge)
WindowCompat.setDecorFitsSystemWindows(window, false)
ViewCompat.setOnApplyWindowInsetsListener(rootView) { v, insets ->
val sysBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
// 시스템 바만큼 패딩을 줘서 겹치지 않게
v.setPadding(sysBars.left, sysBars.top, sysBars.right, sysBars.bottom)
insets // 소비하지 않고 그대로 반환
}
- 이렇게 하면 상태바/내비바 높이가 기기마다 달라도 자동 반영돼서 안전해.
풀스크린 토글할 때
- 풀스크린 ON: 시스템바 숨김 + decorFitsSystemWindows(false) → 컨텐츠를 화면 끝까지
- 풀스크린 OFF: 시스템바 표시 + decorFitsSystemWindows(true) → 시스템이 다시 인셋만큼 아래로 밀어줌
- 전환 직후 requestApplyInsets() 호출로 인셋 재계산 시켜주면 레이아웃 튀는 문제 방지됨
val ic = WindowCompat.getInsetsController(window, window.decorView)
ic.hide(WindowInsetsCompat.Type.systemBars()) // 숨김
// ...
ic.show(WindowInsetsCompat.Type.systemBars()) // 표시
binding.root.requestApplyInsets() // 인셋 재적용
흔한 함정
- 여러 뷰에서 fitsSystemWindows/패딩을 중복 적용 → 여백이 과하게 생김
- 하드코딩된 24dp 같은 값으로 상태바를 추정 → 기기에 따라 어긋남
- decorFitsSystemWindows(false) 했는데 인셋 리스너를 안 달아 내용이 바 뒤로 가려짐
요약: 인셋 = 시스템이 가져가는 가장자리 여백의 실시간 크기.
이 값을 이용해 콘텐츠가 바/노치와 겹치지 않게 패딩/마진을 조절하는 게 핵심!
'잡동사니 > GPT가 알려주는' 카테고리의 다른 글
| [GPT가 알려주는] EVB (개발용 보드) 란? (0) | 2025.09.12 |
|---|---|
| [GPT가 알려주는] Vendor Dependent | Bluetooth Music Player (AVRCP, MediaSession) (0) | 2025.09.11 |
| [GPT가 알려주는] setValue() 와 postValue()의 차이점 (1) | 2025.08.29 |
| [GPT가 알려주는] 코루틴과 Dispatchers (3) | 2025.07.31 |
| [GPT가 알려주는] adb로 내가 write한 변수 읽어오기 (3) | 2025.07.30 |