Jetpack Compose + WindowInsets = 🀩 πŸ₯³

Jetpack Compose μ—μ„œ WindowInsets μ‚¬μš©ν•˜κΈ°

Ji Sungbin
μ„±λΉˆλžœλ“œ
4 min readAug 6, 2022

--

Photo by Oleg Laptev on Unsplash

μ˜¬ν•΄ μ΄ˆμ— ν‚€λ³΄λ“œμ— μ• λ‹ˆλ©”μ΄μ…˜μ„ μ μš©ν•˜λŠ” κ²ƒμœΌλ‘œ WindowInsets 에 λŒ€ν•΄ 닀룬적이 μžˆμŠ΅λ‹ˆλ‹€.

XML μ—μ„œ WindowInsets 을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„  λ‹€ 콜백으둜 κ΅¬ν˜„ν•΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ Jetpack Compose λ₯Ό μ΄μš©ν•˜λ©΄ λŒ€λΆ€λΆ„μ˜ WindowInsets 듀을 λ‹€ Modifier 둜 μ‚¬μš©ν•  수 μžˆμ–΄μ„œ μ•„μ£Ό μ‰½κ²Œ WindowInsets 을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 κΈ€μ—μ„œλŠ” Jetpack Compose μ—μ„œ WindowInsets μ‚¬μš©μ— λŒ€ν•΄ 닀뀄 λ³΄κ² μŠ΅λ‹ˆλ‹€.

WindowInsets 의 κ°œλ…μ— λŒ€ν•΄μ„  닀루지 μ•ŠμŠ΅λ‹ˆλ‹€. WindowInsets 이 μ²˜μŒμ΄μ‹  뢄은 μ˜¬ν•΄ μ΄ˆμ— 올라온 κ²Œμ‹œκΈ€μ„ λ¨Όμ € μ°Έκ³ ν•΄ μ£Όμ„Έμš”.

λ¨Όμ € DecorFitsSystemWindows 을 false 둜 Insets 을 μ‚¬μš©ν•  μ€€λΉ„λ₯Ό ν•΄μ£Όκ² μŠ΅λ‹ˆλ‹€.

IME Insets 을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„  μ•‘ν‹°λΉ„ν‹°λ₯Ό adjustResize 둜 ν•΄μ•Ό ν•˜κ³ , μœ„ μ˜μƒμ† μ•‘ν‹°λΉ„ν‹°λŠ” adjustResize 둜 섀정돼 μžˆμŠ΅λ‹ˆλ‹€.

μ˜ˆμƒλ˜λ‘œ WindowInsets 이 μ μš©λ˜μ§€ μ•Šμ•˜κΈ°μ— λ„€λΉ„κ²Œμ΄μ…˜λ°”μ— λ²„νŠΌμ΄ 가렀지고, ν‚€λ³΄λ“œκ°€ μ˜¬λΌκ°”μ„ λ•Œ ν‚€λ³΄λ“œμ— μ»΄ν¬λ„ŒνŠΈλ“€μ΄ κ°€λ €μ§€κ²Œ λ©λ‹ˆλ‹€.

μƒνƒœλ°”μ™€ λ„€λΉ„κ²Œμ΄μ…˜λ°” 만큼 νŒ¨λ”©μ„ μ μš©ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

XML 에 λΉ„ν•΄ 맀우 κ°„λ‹¨ν•˜κ²Œ Modifier.windowInsetsPadding 을 μ΄μš©ν•΄ κ°€λŠ₯ν•©λ‹ˆλ‹€. Jetpack Compose μ—μ„œ WindowInsets 은 Insets 이 ν•œ 번 μ‚¬μš©λ˜λ©΄ μΆ”ν›„ 쀑볡 μ μš©μ„ λ°©μΉ˜ν•˜κΈ° μœ„ν•΄ μžλ™μœΌλ‘œ ν•΄λ‹Ή Insets 이 consume λ©λ‹ˆλ‹€. λ”°λΌμ„œ μ‚¬μš©ν•˜μ§€ μ•Šμ„ Insets 듀은 μ œμ™Έμ‹œμΌœμ„œ μ‚¬μš©ν•  Insets 만 consume μ‹œν‚€λŠ”κ²Œ ꢌμž₯λ©λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄ systemBars Insets λ₯Ό κ°€μ Έμ˜€κ³ , only ν™•μž₯ ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ μƒνƒœλ°”μ™€ λ„€λΉ„κ²Œμ΄μ…˜λ°”κ°€ μ‘΄μž¬ν•˜λŠ” Vertical λΆ€λΆ„λ§Œ μ‚¬μš©ν•˜κ² λ‹€κ³  μ •μ˜ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 이 결과둜 μ•„λž˜ μ˜μƒμ²˜λŸΌ μ»΄ν¬λ„ŒνŠΈλ“€μ΄ λ„€λΉ„κ²Œμ΄μ…˜λ°” 크기만큼 νŒ¨λ”©λ˜μ„œ λ‹€ 보이게 λ©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ μ—¬μ „νžˆ ν‚€λ³΄λ“œκ°€ 올라였면 ν‚€λ³΄λ“œμ— μ˜ν•΄ μ»΄ν¬λ„ŒνŠΈλ“€μ΄ λ‹€ κ°€λ €μ§‘λ‹ˆλ‹€. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ IME Insets νŒ¨λ”©μ„ μ μš©ν•΄ μ£Όκ² μŠ΅λ‹ˆλ‹€. μ΄λ²ˆμ—λ„ μ•„μ£Ό κ°„λ‹¨ν•˜κ²Œ Modifier.imePadding() 을 μ΄μš©ν•΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.

ν‚€λ³΄λ“œ μ• λ‹ˆλ©”μ΄μ…˜μ΄ 적용된 κ±Έ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. XML 에 λΉ„ν•΄ μ•„μ£Ό μ‰¬μ›Œμ‘ŒμŠ΅λ‹ˆλ‹€. (이런 νŽΈλ¦¬ν•¨μ„ μ €λ§Œ λˆ„λ¦΄ 순 μ—†μ–΄μ„œ 이 글을 μž‘μ„±ν•˜κ²Œ λμŠ΅λ‹ˆλ‹€.)

Insets 을 λ°”λ‘œ νŒ¨λ”©μœΌλ‘œ μ μš©μ‹œν‚€λŠ”κ²Œ μ•„λ‹Œ μ‚¬μ΄μ¦ˆλ§Œ λ‹¨λ…μœΌλ‘œ μ–»μ–΄μ˜¬ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

Insets 값은 ν”½μ…€(Int) κ°’μœΌλ‘œ λ°›μ•„μ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ»΄ν¬μ¦ˆμ—μ„œλŠ” Dp λ‹¨μœ„λ₯Ό 자주 μ‚¬μš©ν•¨μœΌλ‘œ μ €λŠ” toDp() λ₯Ό 톡해 Dp 둜 λ³€κ²½ν•΄μ„œ μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

μ—¬κΈ°κΉŒμ§€κ°€ 주둜 μ‚¬μš©λ˜λŠ” WindowInsets λ“€ μž…λ‹ˆλ‹€. 이 밖에도 μ‹œμŠ€ν…œ 제슀처λ₯Ό λΉ„ν™œμ„±ν™” ν•˜λŠ” Modifier.systemGestureExclusion() 와 같이 훨씬 λ§Žμ€ WindowInsets 듀이 κ΅¬ν˜„λΌ μžˆμŠ΅λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ 곡식 λ¬Έμ„œλ₯Ό 확인해 μ£Όμ„Έμš”.

ν•œ 가지 μ•„μ‰¬μš΄ 점은 λͺ¨λ“  WindowInsets 듀이 Jetpack Compose 둜 μ œκ³΅λ˜μ§„ μ•ŠμŠ΅λ‹ˆλ‹€. ν˜„μž¬ 이 글을 μž‘μ„±ν•˜λŠ” μ‹œμ  κΈ°μ€€μœΌλ‘œ isVisible, animationInProgress, animationFraction, layoutInsets/animatedInsets μ΄λ ‡κ²Œ 4κ°€μ§€μ˜ Insets 은 μ œκ³΅λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. [κ΄€λ ¨ 이슈: 217770337]

끝!

μ›λž˜ 이 κΈ°λŠ₯은 accompanist λ₯Ό 톡해 제곡되고 μžˆμ—ˆμ§€λ§Œ, 컴포즈의 foundation 에 WindowInsets 제곡이 μΆ”κ°€λ˜λ©΄μ„œ κΈ°μ‘΄ accompanist λŠ” deprecated λ˜μ—ˆμŠ΅λ‹ˆλ‹€. Jetpack Compose λŠ” μ—¬λŸ¬λͺ¨λ‘œ 정말 νŽΈλ¦¬ν•œκ±° κ°™μŠ΅λ‹ˆλ‹€.

μ•ˆλ“œλ‘œμ΄λ“œ 개발자 뢄듀을 μœ„ν•œ μΉ΄μΉ΄μ˜€ν†‘ μ˜€ν”ˆ μ±„νŒ…λ°©μ„ μš΄μ˜ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

--

--

Ji Sungbin
μ„±λΉˆλžœλ“œ

Experience Engineers for us. I love development that creates references.