๐ ๋ด๋น๊ฒ์ด์
๋ด๋น๊ฒ์ด์
์ด๋?
- ํ๋ฉด ๊ฐ ์ด๋์ ๊ด๋ฆฌํ๋ ๊ฒ
ex) ๋ก๊ทธ์ธ ํ๋ฉด -> ํ ํ๋ฉด
- Jetpack Compose์์๋ ๊ธฐ์กด XML ๋ฐฉ์๊ณผ ๋ค๋ฅด๊ฒ ์ปดํฌ์ ๋ธ ํจ์ ์ค์ฌ์ ์ ์ธํ ๋ด๋น๊ฒ์ด์
์ ๊ณต
๋ด๋น๊ฒ์ด์
์ปจํธ๋กค๋ฌ์ ํธ์คํธ
val navController = rememberNavController()
NavHost(
navController = navController,
startDestination = "home"
) {
composable("home") { HomeScreen(navController) }
composable("profile") { ProfileScreen() }
}
- NavController๋ผ๋ ๋ด๋น๊ฒ์ด์
์ ์ฉ ์ปจํธ๋กค๋ฌ ์ ์ธ
- ํ๋ฉด ์ด๋์ ์ง์ํ๋ ์ญํ ์ ํ๋ฉฐ, NavHost๋ผ๋ ๊ตฌ์ฑ ์์์ ํจ๊ป ์ฌ์ฉ
NavController: ํ๋ฉด ์ด๋ ์ ์ด
NavHost: ๋ชฉ์ ์ง๋ค์ ์ฐ๊ฒฐํ๊ณ , ์ด๋ ํ๋ฉด์์ ์์ํ ์ง๋ฅผ ๊ฒฐ์
=> ๋ด๋น๊ฒ์ด์
์์คํ
์ NavController์ NavHost๊ฐ ์ง์ ์ด๋ค ๋์!!
๋ชฉ์ ์ง ์ถ๊ฐ์ ์ธ์ ์ ๋ฌ
- NavHost์ ์ฌ๋ฌ ๊ฐ์ ๋ชฉ์ ์ง๋ฅผ ๋ฑ๋ก-> ๊ฐ ํ๋ฉด์ ์ ์ ๊ฐ๋ฅ
- ํน์ ํ๋ฉด์ผ๋ก ์ด๋ํ ๋ ํ์ํ ์ ๋ณด ์ ๋ฌ ๊ฐ๋ฅ
ex) ์ฌ์ฉ์ ID๋ฅผ ๋๊ฒจ์ ํ๋กํ ํ์ด์ง์์ ํด๋น ์ ์ ์ ๋ณด๋ฅผ ๋ถ๋ฌ์ค๋ ๊ฒ
=> ๋ชฉ์ ์ง๋ฅผ ๊ตฌ์ฑํ๊ณ ์ธ์๋ฅผ ์ ๋ฌํจ์ผ๋ก์จ ํ๋ฉด ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๋ด๋น๊ฒ์ด์
์ด ์์ฑ
ํ๋จ ๋ด๋น๊ฒ์ด์
๋ฐ ๋ค๋ฃจ๊ธฐ
- ์ฑ์ ๋ณด๋ค ์ง๊ด์ ์ผ๋ก ๋ง๋ค๊ธฐ ์ํด ํ๋จ ๋ฐ๋ฅผ ์ฌ์ฉ
- ํ, ์ค์ , ๋ง์ดํ์ด์ง ๋ฑ์ ํ๋ฉด์ ์์ด์ฝ์ผ๋ก ํ์
- Scaffold ์ปดํฌ๋ํธ์ ํจ๊ป ์์ฃผ ์ฌ์ฉ๋๋ฉฐ, ์์ดํ
์ ํด๋ฆญํ ๋๋ง๋ค NavController๋ฅผ ํตํด ํด๋น ๋ชฉ์ ์ง๋ก ์ด๋ํ๋๋ก ์ค์
NavController์ BottomNavigationItem์ ์ฐ๊ฒฐํด ํ์ฌ ์ ํ๋ ํ๋ฉด์ ํ์ํ๋ ๋ก์ง์ด ์ค์!!!
๐ NavigationDemo ํํ ๋ฆฌ์ผ
ํ๋ก์ ํธ ๊ตฌ์ฑ
- Welcome, Home, Profile ์ธ ๊ฐ์ ํ๋ฉด์ ๊ตฌํ
- ๊ฐ ํ๋ฉด์ ํ๋์ ์ปดํฌ์ ๋ธ ํจ์๋ก ๋ง๋ค๊ณ , ๋ด๋น๊ฒ์ด์
์ ํตํด ํ๋ฉด์ ๋๋๋ค ์ ์๋๋ก ์ค์
ํต์ฌ ๊ฐ๋
- ๊ฒฝ๋ก๋ฅผ ๋ฌธ์์ด๋ก ์ ์ธ
- ๊ฐ ๊ฒฝ๋ก๋ง๋ค ๋์๋๋ ํ๋ฉด์ ๋ฑ๋ก
- ๋ฒํผ์ ํด๋ฆญํ๋ฉด NavController๋ฅผ ํตํด ๋ค๋ฅธ ํ๋ฉด์ผ๋ก ์ด๋
ex) ์ฐ์ปด ํ๋ฉด์์ ํ ํ๋ฉด์ผ๋ก ์ด๋ํ๊ณ , ๋ค์ ํ์์ ํ๋กํ ํ๋ฉด์ผ๋ก ์ ํํ๋ ํ๋ฆ์ ๋ฐ๋ผ๊ฐ๋ ๊ตฌ์กฐ
๐ ํ๋จ ๋ด๋น๊ฒ์ด์
๋ฐ ํํ ๋ฆฌ์ผ
BottomBarDemo ํ๋ก์ ํธ
@Composable
fun BottomBarDemo() {
val navController = rememberNavController()
Scaffold(
bottomBar = {
BottomNavigation {
BottomNavigationItem(
icon = { Icon(Icons.Default.Home, contentDescription = null) },
label = { Text("Home") },
selected = true,
onClick = { navController.navigate("home") }
)
}
}
) {
NavHost(navController, startDestination = "home") {
composable("home") { HomeScreen() }
}
}
}
- ํ๋จ ํญ UI๋ฅผ ๊ฐ์ง ์ฑ์ ๊ตฌ์ฑ
- ์ฌ์ฉ์๋ ํ๋จ ๋ฐ์ ์๋ ์ฌ๋ฌ ์์ด์ฝ์ ๋๋ฌ ๊ฐ๊ธฐ ๋ค๋ฅธ ํ๋ฉด์ผ๋ก ์ด๋ ๊ฐ๋ฅ
- Scaffold ๊ตฌ์กฐ ๋ด์ bottomBar ์ฌ๋กฏ ์ฌ์ฉ -> ํ๋ฉด์ ์๋จ, ๋ณธ๋ฌธ, ํ๋จ์ ๋ช
ํํ๊ฒ ๋ถ๋ฆฌํ ์ ์์ด ๊น๋ํ UI ๊ฐ๋ฅ
ํต์ฌ ๊ฐ๋
-
ํ๋จ ๋ฐ์ ์์ดํ
์ ๋ฆฌ์คํธ๋ก ๋ง๋ค์ด ๋ฐ๋ณต ์ถ๋ ฅ ๊ฐ๋ฅ
-
ํ์ฌ ์ ํ๋ ํ๋ฉด์ ๊ธฐ์ค์ผ๋ก ์์ดํ
๊ฐ์กฐ ํ์
-
์์ด์ฝ + ํ
์คํธ๋ก ๊ตฌ์ฑ๋ ํญ UI
๐ ์ ์ค์ฒ ๊ฐ์งํ๊ธฐ
ํด๋ฆญ ์ ์ค์ฒ
- ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ ์ค์ฒ
- ํน์ ์์ญ์ ํฐ์นํ์ ๋ ๋ฐ์ํ๋๋ก ๋ง๋๋ ๊ฒ-> Modifier.clickable์ ์ฌ์ฉ
- ํด๋ฆญ ์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๊ฑฐ๋ ์๋ก์ด ๋์ ์ ๋ ๊ฐ๋ฅ
ex) ๋ฒํผ์ฒ๋ผ ์๋ํ๋ ํ
์คํธ
์คํฌ๋กค ์ ์ค์ฒ
- ํ๋ฉด์ ์์๋๋ก ์คํฌ๋กคํ๋ ๋์ -> Modifier.scrollable ๋๋ Modifier.verticalScroll ๊ฐ์ ๋ชจ๋ํ์ด์ด๋ฅผ ํตํด ๊ตฌํ ๊ฐ๋ฅ
- ์ํ๋ฅผ ๊ธฐ์ตํ๋ ScrollState๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฉด ํ์ฌ ์คํฌ๋กค ์์น๋ ์ถ์ ๊ฐ๋ฅ
์ผ๋ฐ์ ์ธ UI ์คํฌ๋กค์ verticalScroll, ์ฌ์ฉ์ ์ ์ ์คํฌ๋กค์ scrollable์ ์ฌ์ฉ
ํ๋/์ถ์, ํ์ , ์ด๋ ์ ์ค์ฒ
- ์ด๋ฏธ์ง ๋ทฐ์ด๋ ์ง๋๋ฅผ ํ๋/์ถ์ํ ๋ ์ฌ์ฉ
- Compose์์๋ pointerInput๊ณผ detectTransformGestures ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌ ๊ฐ๋ฅ
zoom, rotation, pan ๊ฐ์ ์ด์ฉํด ์ด๋ฏธ์ง๋ ๊ฐ์ฒด์ ์์ฑ์ ๋์ ์ผ๋ก ๋ณ๊ฒฝ
๐ ์ค์์ดํ ์ ์ค์ฒ ๊ฐ์งํ๊ธฐ
์ค์์ดํ๋?
- ์ข์ฐ ํน์ ์ํ๋ก ์๊ฐ๋ฝ์ ์์ง์ฌ ํน์ ๋์์ ์ ๋ํ๋ ์ ์ค์ฒ
ex) ๋ฆฌ์คํธ์์ ํญ๋ชฉ์ ์ข์ธก์ผ๋ก ๋ฐ๋ฉด ์ญ์ ๋ฒํผ์ด ๋ํ๋๋ UI ๊ฐ์ ๊ฒ
์ค์์ดํ ๊ตฌํ ๊ตฌ์กฐ
- swipeable ๋ชจ๋ํ์ด์ด๋ฅผ ํตํด ์ค์์ดํ ๊ธฐ๋ฅ์ ๊ตฌํ
- ์ํ๋ฅผ ์ ์ํ๊ณ , ์ต์ปค๋ผ๋ ๊ธฐ์ค์ ์ ์ ์ธํ์ฌ ์ด๋ ์์น๊น์ง ์ค์์ดํ ๋์๋์ง ํ๋จ
=> ๊ธฐ์ค์ ์ ์์น์ ์ํ๊ฐ์ ์ฐ๊ฒฐํ๋ ์ต์ปค ๋งต์ ์ ์ค๊ณํ๋ ๊ฒ์ด ์ค์!!
SwipeDemo ํ๋ก์ ํธ
val swipeState = rememberSwipeableState(0)
val anchors = mapOf(0f to 0, 300f to 1)
Box(
modifier = Modifier
.fillMaxWidth()
.height(80.dp)
.swipeable(
state = swipeState,
anchors = anchors,
thresholds = { _, _ -> FractionalThreshold(0.3f) },
orientation = Orientation.Horizontal
)
) {
Text("์ค์์ดํ ํด๋ณด์ธ์", modifier = Modifier.align(Alignment.Center))
}
- ์ค์์ดํ ๊ฐ๋ฅํ ๋ฐ์ค ์์ฑ
- swipeable ์ํ ์ง์
- ์๊ณ์ ์ ์ค์ ํด ์ด๋ ์ ๋ ์ด๋ํด์ผ ์ํ๊ฐ ๋ฐ๋์ง๋ฅผ ์ง์
=> ์ฌ์ฉ์์ ์ค์์ดํ ๋์์ ๋ฐ๋ผ UI๊ฐ ์์ฐ์ค๋ฝ๊ฒ ๋ฐ์