Partial_Anchored_Bottom_Sheet - boostcampwm-2024/and04-Nature-Album GitHub Wiki

โœ… ์ง„ํ–‰ํ•œ ๊ธฐ๋Šฅ

Partial Anchored Bottom Sheet ๊ตฌํ˜„

๐Ÿ’ก๋ฌธ์ œ ํ•ด๊ฒฐ ๊ณผ์ • ๊ธฐ๋ก

๋‚ด๊ฐ€ ์‚ฌ์šฉํ•  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๋‚˜?

BottomSheet ์„ ํƒ โ‡’ Material Design 3์—์„œ ์ œ๊ณตํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋“ค์˜ ์‚ฌ์šฉ์— ์–ด๋ ค์›€์ด ์žˆ์–ด ์ปค์Šคํ…€ ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.

Why?

  • Partial - ์ตœ์†Œํ™”, ์ตœ๋Œ€ํ™” ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ค‘๊ฐ„ ์œ„์น˜์— ์•ต์ปค๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•œ๋‹ค.
  • No Scrim - bottomSheet ๋’ค์˜ ui์™€ ์ƒํ˜ธ์ž‘์šฉ์ด ๊ฐ€๋Šฅํ•ด์•ผํ•œ๋‹ค.

1. ์ผ๋‹จ Draggable์„ ์‚ฌ์šฉํ•ด๋ณด์ž

https://github.com/user-attachments/assets/2fbedc9e-cfa4-4ef6-837b-dbdc7d19ea21

์ปดํฌ์ €๋ธ”์˜ modifier์— draggable์„ enable๋กœ ์„ค์ •ํ•˜๋ฉด ํ•ด๋‹น ์ปดํฌ์ €๋ธ”์€ ๋“œ๋ž˜๊ทธํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

draggable์„ ์„ค์ •ํ• ๋•Œ ๋“œ๋ž˜๊ทธ ๋ฐฉํ–ฅ์„ ์„ค์ •ํ•˜๊ณ , ๋“œ๋ž˜๊ทธ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„๋•Œ ์ง€์ •ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ์˜ delta๋ฅผ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•  ์ฝœ๋ฐฑ์ธ draggableState๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

@Composable
fun Foo() {
    var offsetY by remember { mutableStateOf(0f) }
    
    Box(
	modifier = Modifier
	    .offset { IntOffset(0, offsetY.roundToInt()) }
	    .draggable(
       	        orientation = Orientation.Vertical,
               	state = rememberDraggableState { delta ->
			offsetY = (offsetY + delta)
               	},
       )

์‹ค์ œ ์ปดํฌ์ €๋ธ”์˜ ์ด๋™์€ ์‹œ์ž‘ ์œ„์น˜๋กœ๋ถ€ํ„ฐ์˜ offset(ํ”ฝ์…€)์„ remember๋กœ ๊ด€๋ฆฌํ•˜๊ณ  delta๋งŒํผ ๋ณ€ํ™”์‹œํ‚ค๋ฉฐ modifier์— offset์„ ์ ์šฉํ•˜๋Š”์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

์ด๋•Œ offset๊ณผ delta๋Š” ์‹ค์ œ ๊ธฐ๊ธฐ์˜ ํ”ฝ์…€๊ฐ’์ด๋ฏ€๋กœ ๋‹ค๋ฅธ ๋‹จ์œ„๋ฅผ ํ”ฝ์…€๋กœ ์ „ํ™˜ํ• ๋•Œ๋Š” density ๋ธ”๋Ÿญ์•ˆ์—์„œ ์ฒ˜๋ฆฌํ•ด ์ค˜์•ผ ํ•œ๋‹ค. (modifier์˜ offset์ด density ๋ธ”๋Ÿญ์„ ์‚ฌ์šฉํ•œ๋‹ค.)

2. Draggable Bottom Sheet

https://github.com/user-attachments/assets/d194f90e-2469-4daa-8815-9e7619f2fc11

draggableํ•œ ์˜์—ญ์€ bottomsheet ์ƒ๋‹จ์˜ handle์—๋งŒ ํ•œ์ •ํ•˜๊ณ 

handle์„ ๋“œ๋ž˜๊ทธ ํ• ๋•Œ offset์€ sheet ์ „์ฒด์— ์ ์šฉ

ํ•˜์ง€๋งŒ ์•ต์ปค๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋“œ๋ž˜๊ทธ๋ฅผ ์ค‘๋‹จํ–ˆ์„๋•Œ์˜ ์œ„์น˜์™€ ์†๋„์— ๋”ฐ๋ผ ์–ด๋””๋กœ ์ด๋™ํ• ์ง€ ์ •ํ•ด์•ผ ํ•˜๋Š”๋ฐ modifier์— ์‹คํ—˜์‹ค ๊ธฐ๋Šฅ์œผ๋กœ anchoredDraggable์ด ์žˆ๋Š”๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค.

3. AnchoredDraggable

์ดˆ๊ธฐ ์œ„์น˜์— ํ•ด๋‹นํ•˜๋Š” state, ๊ฐ state์™€ ์‹ค์ œ ๊ธฐ๊ธฐ์ƒ์—์„œ ์•ต์ปค๋กœ ์‚ฌ์šฉํ•  ์œ„์น˜, ๋“œ๋ž˜๊ทธ๋ฅผ ์ค‘๋‹จํ–ˆ์„๋•Œ ์–ด๋–ค ์•ต์ปค๋กœ ์œ„์น˜ ์‹œํ‚ฌ์ง€์— ๋Œ€ํ•œ Threshold์™€ ์•ต์ปค๋กœ ์œ„์น˜์‹œํ‚ฌ๋•Œ ์‚ฌ์šฉํ•  animation๋“ฑ์„ ์ •์˜ํ•œ AnchoredDraggableState๋ฅผ modifier์˜ anchoredDraggable์— state๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

https://github.com/user-attachments/assets/38a5e033-1f24-44b9-b95b-27df03f5e044

โ— BottomPadding

bottom sheet์˜ ํฌ๊ธฐ๋ฅผ ํ™”๋ฉด ์ „์ฒด์˜ ํฌ๊ธฐ๋กœ ์„ค์ •ํ–ˆ๋Š”๋ฐ sheet๊ฐ€ ์ค‘๊ฐ„์— ์œ„์น˜ํ•˜๋ฉด sheet์˜ ํ•˜๋‹จ์ด ํ™”๋ฉด ์•„๋ž˜์— ๊ฐ€๋ ค์ ธ content ์ „์ฒด๋ฅผ ์Šคํฌ๋กค ํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.

sheet์˜ content์— ํ•ด๋‹นํ•˜๋Š” ์˜์—ญ์— bottom paddind์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด AnchoredDraggableState์˜ anchor ํฌ์ง€์…˜์„ dp๋กœ ๋ณ€ํ™˜ํ•ด ํ•˜๋‹จ์— ํŒจ๋”ฉ์œผ๋กœ ์ถ”๊ฐ€ํ–ˆ์—ˆ๋Š”๋ฐ ์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅธ ํŒจ๋”ฉ์ด ์ถ”๊ฐ€๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.

ํ•˜๋‹จ์— ํŒจ๋”ฉ์œผ๋กœ ์ถ”๊ฐ€ํ•  dp๊ฐ’์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด AnchoredDraggableState์— ์‚ฌ์šฉํ•œ ํ”ฝ์…€๊ฐ’(Float)์— .dp๋กœ ํƒ€์ž…์„ ๋ฐ”๊ฟจ์—ˆ๋Š”๋ฐ ์‹ค์ œ ๊ธฐ๊ธฐ ํ•ด์ƒ๋„๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์€ ๊ฐ’์„ ํŒจ๋”ฉ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ ์ƒ๊ธด ๋ฌธ์ œ์˜€๋‹ค.

.dp ๋Œ€์‹  with(density) { .toDp() } ์œผ๋กœ ์ˆ˜์ •ํ•˜์—ฌ ๋ฌธ์ œ ํ•ด๊ฒฐ

  • with(density) { .toDp() } ์™€ .dp์˜ ์ฐจ์ด

    ์ฐจ์›์„ ๋ณ€ํ™˜ํ• ๋•Œ ์‹ค์ œ ํ™”๋ฉด์˜ ํ”ฝ์…€ ๋ฐ€๋„๋ฅผ ๊ณ ๋ คํ•ด ์Šค์ผ€์ผ๋ง ํ•˜๋Š”์ง€ ์œ ๋ฌด

    ์Šคํฌ๋ฆฐ์ƒท 2024-11-25 13-22-19

    ์Šคํฌ๋ฆฐ์ƒท 2024-11-25 13-22-51