기록

[GPT가 알려주는] 인셋(insets)이란? 본문

잡동사니/GPT가 알려주는

[GPT가 알려주는] 인셋(insets)이란?

heylo 2025. 9. 8. 18:24

비디오 플레이어 전체화면으로 변경 시,
시스템 상단바, 하단 네비게이션 바를 없애면서 
인셋을 공부하였다.

 

인셋(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) 했는데 인셋 리스너를 안 달아 내용이 바 뒤로 가려짐

요약: 인셋 = 시스템이 가져가는 가장자리 여백의 실시간 크기.
이 값을 이용해 콘텐츠가 바/노치와 겹치지 않게 패딩/마진을 조절하는 게 핵심!