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์ ์ฐจ์ด
์ฐจ์์ ๋ณํํ ๋ ์ค์ ํ๋ฉด์ ํฝ์ ๋ฐ๋๋ฅผ ๊ณ ๋ คํด ์ค์ผ์ผ๋ง ํ๋์ง ์ ๋ฌด