Jetpack Compose - Picplz/picplz-aos GitHub Wiki
UI ๋๊ตฌ ํคํธ๋ก์ ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์ ํธ๋ฆฌ ํํ๋ก UI๋ฅผ ๊ตฌ์ฑํ ์ ์๋ค


Composable๋ผ๋ ui ํจ์ ํํ์ ์์ ฏ์ ๊ณ์ธต์ ์ผ๋ก ๊ตฌ์ฑ
์ฐธ๊ณ : https://developer.android.com/develop/ui/compose/mental-model?hl=ko
compose์์ ์๋ก์ด ๊ฐ์ ์ ๋ฐ์ดํธํ ๋ ๋ณ๊ฒฝ๋์ง ์์ ํจ์๋ ์ฌ๊ตฌ์ฑํ์ง ์๊ณ , ๊ตฌ์ฑ ๊ฐ๋ฅํ ํจ์๋ฅผ ๋ค์ ํธ์ถ
Composable(
// ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด ์ธ๋ถ์์ ๊ฐ์ ๋ฐ์์ ์ฌ์ฉํ๊ฑฐ๋, ์ ์ฒด์ ์ธ ์ค์ ์ ๋ณ๊ฒฝํ ๋ ์ฌ์ฉ
) {
// ํด๋น composable ๋ด๋ถ์ ui ๊ตฌ์ฑ์ผ๋ก composable๋ก ๊ตฌ์ฑ -> composable์ ํธ๋ฆฌ ํํ
}
Composable์ ํฌ๊ธฐ, ๋ฐฐ๊ฒฝ, ์์น, ํด๋ฆญ ์ด๋ฒคํธ ๋ฑ์ ๊ธฐ๋ณธ ์ค์
์ฒด์ธ ํํ๋ก ์กฐํฉํ ์ ์๋ค
์์ Composable์ ๊ธฐ์ค์ผ๋ก ์ต๋ ๊ณต๊ฐ์ผ๋ก ์ฑ์ฐ๋ ์ค์
-
๊ฐ๋ก ์ธ๋ก ์ฌ๋ฐฑ์ ์ ๋ถ ์ฃผ๋ ๊ฒฝ์ฐ -> .padding(10.dp)
-
๊ฐ๋ก, ์ธ๋ก ๋ณ๊ฐ๋ก ํน์ ํ์ชฝ์๋ง ์ฃผ๋ ๊ฒฝ์ฐ ->
.padding(horizontal = 32.dp)
,.padding(vertical = 32.dp)
dp
- Density-independent Pixels
- ๊ธธ์ด์ ์ฌ์ฉ ํ๋ฉด ๋ฐ๋์ ๋ฐ๋ผ ํฌ๊ธฐ๊ฐ ์กฐ์ ๋๋ ๋จ์
- ํ๋ฉด ๋ฐ๋์ ๋ฐ๋ผ ์กฐ์ ๋๊ธฐ์ ํด์๋์ ๋ง์ถฐ์ ์ ์ ํ ํฌ๊ธฐ ์ค์ ๊ฐ๋ฅ
sp
- Scale-independent Pixels
- ํ ์คํธ ํฌ๊ธฐ์ ์ฌ์ฉ
Button(
onClick = {
viewModel.handleIntent(LoginIntent.NavigateToKaKao)
},
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 32.dp),
colors = ButtonDefaults.buttonColors(
containerColor = Color(0xFFFFEB3B),
contentColor = Color.Black
), // color์๋ ButtonDefaults.buttonColors๊ฐ์ฒด๋ฅผ ๋ฐ์ ์ ์๊ณ ๊ทธ ์ธ๋ถ ์ค์ ์ผ๋ก `containerColor`, `contentColor`๋ฑ์ ์
๋ ฅ ๊ฐ๋ฅ
shape = RoundedCornerShape(10.dp)
) {...}
Text(
text = "์นด์นด์ค๋ก ๊ณ์ํ๊ธฐ",
modifier = Modifier.padding(
vertical = 8.dp
),
style = TextStyle(
fontSize = 16.sp,
fontWeight = FontWeight.Bold,
color = Color(0xFF371C1D)
) // ํ
์คํธ ์คํ์ผ์ `TextStyle` ๊ฐ์ฒด์ ๊ทธ ํ์ ํด๋์ค ์
๋ ฅ์ผ๋ก ์ค์ ๊ฐ๋ฅ
)
Composable ๋ณ๋ก color๋ shape๊ฐ์ ์ค์ ๋งค๊ฐ๋ณ์๋ค์ด ์กด์ฌํ๋ฉฐ, Color๋ shape ๊ฐ์ด ์ ํด์ง ํ ํ๋ฆฟ์ด ํ์ํ ๊ฒฝ์ฐ์ ์ด๋ฅผ ์ ๊ณตํด์ฃผ๋ ๊ฐ์ฒด๋ค์ด ์์
์ฑ์ ์ต์๋จ ๊ธฐ๋ณธ ๋ ์ด์์ ์ค์ ๊ฐ๋ฅ
-
TopBar
,BottomBar
,Snack-Bar
,fab
๋ฑ์ ui ์์ ์ค์ ๊ฐ๋ฅ - ํด๋น ์ฑ ui ์์๋ค์ ๋ ์ด์์ ๊ธธ์ด ๊ฐ ์ด์ฉ ๊ฐ๋ฅ
- ์์) ์๋จ ์ํ ๋ฐ์ height ๊ฐ์ธ
innerPadding
์ด์ฉ ๊ฐ๋ฅ- ์ต์๋จ ui ์์์ ์ ์ฉ
-
Scaffold( modifier = Modifier .fillMaxSize(), ) { innerPadding -> Box( modifier = Modifier .fillMaxSize() .padding(innerPadding), contentAlignment = Alignment.Center ) {} }
- ์์) ์๋จ ์ํ ๋ฐ์ height ๊ฐ์ธ
- ์์ Composable์ Stack ํํ๋ก ์์ ๋กญ๊ฒ ๋ฐฐ์น ๊ฐ๋ฅ
- ๊ฒน์ณ์ ๋ฐฐ์น ๊ฐ๋ฅ
- ๊ธฐ๋ณธ ์์ญ ๊ตฌ๋ถ์ ํ ๋๋ ์ฌ์ฉ
contentAlignment
:
- ์์ :
contentAlignment = Alignment.Center
์์ ์ปดํฌ์๋ธ์ ์ํ์ผ๋ก ๋ฐฐ์น
horizontalArrangement
: ์ํ์ผ๋ก๋ ๊ฐ๊ฒฉ ์ค์
-
Arrangement
๊ฐ์ฒด๋ฅผ ํตํด ์ ๋ ฅ - ์์ :
horizontalArrangement = Arrangement.SpaceBetween
verticalAlignment
: ์์ง์ผ๋ก๋ ์์น ์ค์
- ์์ :
verticalAlignment = Alignment.CenterVertically
์์ Composable์ ์์ง์ผ๋ก ๋ฐฐ์น
verticalArrangement
: ์์ง์ผ๋ก ๊ฐ๊ฒฉ์ ์ค์
- Arrangement ๊ฐ์ฒด๋ฅผ ํตํด ์ ๋ ฅ
- ์์ : verticalArrangement = Arrangement.SpaceBetween
horizontalAlignment
: ์ํ์ผ๋ก ์์น ์ค์
- ์์ : horizontalAlignment = Alignment.CenterHorizontally
- ์ญํ : Column ๋ด๋ถ์ ์์ Composable์ ์ํ ๋ฐฉํฅ์ผ๋ก ์ด๋ป๊ฒ ์ ๋ ฌํ ์ง ๊ฒฐ์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ผ์ชฝ, ์ค๋ฅธ์ชฝ ๋๋ ์ค์ ์ ๋ ฌ์ ์ค์ ํ ์ ์์ต๋๋ค.
Spacer(modifier = Modifier.width(10.dp))
์ฌ๋ฐฑ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉ padding/gap๊ฐ์ modifier ์ค์ ์ ์ผ๋ถ ์ธ๋ชจ์๋ ๊ฒน์น๋ Composable
Composable๊ฐ์ ๊ฐ๊ฒฉ์ ๋ง๋ค๋ ์ฌ์ฉํ๋ค
height, width ์ค์ ์ ํตํด ๊ฐ๊ฒฉ์ ๋ง๋ฆ

Scaffold
โโโ Button
โโโ Row
โโโ Image
โโโ Spacer
โโโ Text
// LoginScreen.kt
import ...
@Composable
fun LoginScreen(
navController: NavController,
modifier: Modifier = Modifier,
viewModel: LoginViewModel = viewModel()
) {
Scaffold(...) { innerPadding ->
Box(...) {
Button(...) {
Row(...) {
Image(...)
Spacer(...)
Text(...)
}
}
}
}
}