์ด๋ฒ์ design system์ ๋ง๋๋ ์์ ์ ํ๊ณ ์์๋๋ฐ checkbox๋ฅผ ๋ง๋ค์ด์ผ ํ ์ผ์ด ์์๋ค.
์ด๋ฒ์ ํ์ ๊ฐ์ ๊ฒฝ์ฐ ๋ง๊ณ ๋ ๋ค๋ฅธ ํ๋ก์ ํธ๋ฅผ ํ ๋์๋ checkbox๋ฅผ ์ฌ์ฉํด์ผ ํ ์ผ์ด ์์ ๊ฒ์ด๋ค.
ํ์ง๋ง ๊ธฐ๋ณธ checkbox์ ๋ชจ์์ผ๋ก๋ ๋ง์กฑ์ค๋ฝ์ง ๋ชปํ ๊ฒฝ์ฐ๋ ์์ ๊ฒ์ด๋ค.
๊ทธ๋์ ์ด๋ฒ์ ํ์๋ custom checkbox๋ฅผ ๋ง๋ค์ด ๋ณด์๋ค.
ํ์๊ฐ checkbox๋ฅผ ์ด๋ป๊ฒ ๋ง๋ค์๋์ง ์ฝ๋๋ฅผ ํตํด ํ์ธํด ๋ณด์.
1. custom checkbox๋ฅผ ๋ง๋ค๊ธฐ ์ํ ์ค๋น๋ฌผ(?)
์ผ๋จ ์ฒ์ ๋ง๋ค ๋ ํ์๋ custom dialog๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๋ฌด์์ด ํ์ํ์ง ์๊ฐํด ๋ณด์๋ค.
๊ทธ๋์ ํ๋์ ๊ฒฐ๋ก ์ ๋๋ฌํ๋ค!
check ๋์์ ๋์ checkbox layout, check ๋์ง ์์์ ๋์ checkbox layout
์ฌ์ค ์ ๋ ๊ฐ๋ง ์์ผ๋ฉด ๋ง๋ค๊ธฐ ์ฌ์ด component๋ผ ์ด๋ฒ์ ์ฒ์์ด์๋ ํ์๋ ์ฝ๊ฒ ๋ง๋ค์๋ ๊ฒ ๊ฐ๋ค.
์ด์ ์ค๋น๋ฌผ(?)์ ์์์ผ๋ ์ง์ง๋ก ์ฝ๋๋ก ํ์ธํด ๋ณด์.
2. custom checkbox ์ฝ๋
๋จผ์ check ๋ ๊ฒฝ์ฐ์ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ์ checkbox ui๋ฅผ ๋ง๋ค์ด ์ฃผ๊ฒ ๋ค.
@Composable
private fun CheckBoxSelected() {
Box(
modifier = Modifier
.size(24.dp)
.clip(RoundedCornerShape(10.dp))
.background(Theme.colors.primary10),
contentAlignment = Alignment.Center
) {
CheckIcon(contentDescription = "check icon")
}
}
@Composable
private fun CheckBoxUnSelected() {
Box(
modifier = Modifier
.size(24.dp)
.clip(RoundedCornerShape(10.dp))
.background(Theme.colors.background)
.border(
width = 1.dp,
color = Theme.colors.neutral30,
shape = RoundedCornerShape(10.dp)
),
)
}
check ๋ ๊ฒฝ์ฐ์๋ ์ค์์ check icon์ด ๋ค์ด๊ฐ ํํ๋ก ๋ง๋ค์๊ณ , check ๋์ง ์์ ๊ฒฝ์ฐ์๋ ํฐ ๋ฐํ์ ํ์ border๋ฅผ ์์ฑํด ์ฃผ์๋ค.
์์์ ์ฌ๋ฌ๋ถ์ ์์ ์ด์ง๋ง ํ์ฌ ํ์๋ ์ง์ ๋ง๋ theme๋ฅผ ์ฌ์ฉ ์ค์ด๊ธฐ์ ์ฌ๋ฌ๋ถ๋ค๊ณผ ์ฝ๋๊ฐ ๋ค๋ฅผ ์๊ฐ ์๋ค.(๋์ค์ ์๊ฐ์ด ๋๋ฉด custom theme์ ๊ด๋ จ๋ ๊ฒ๋ ์ฌ๋ ค๋ณด๊ฒ ์ต๋๋ค.)
์์ ๋ ๊ฐ๋ก ํด์ฃผ์ง ์๊ณ ์ฌ๋ฌ๋ถ๋ค์ด ์ง์ custom ํด์ ๋ง๋ค์ด๋ ์๊ด์๋ค.
์ด์ ๋ค์์๋ checkbox code๋ฅผ ํ์ธํด ๋ณด์.
@Composable
@OptIn(ExperimentalMaterialApi::class)
fun CheckBox(
modifier: Modifier = Modifier,
checked: Boolean = false,
onCheckedChange: (Boolean) -> Unit
) {
var checkBoxState by remember { mutableStateOf(checked) }
Card(
modifier = modifier
.size(24.dp),
shape = RoundedCornerShape(10.dp),
onClick = {
checkBoxState = !checkBoxState
onCheckedChange(checkBoxState)
},
elevation = 0.dp
) {
if (checkBoxState) CheckBoxSelected()
else CheckBoxUnSelected()
}
}
click listener๋ก ์ํ๋ฅผ ๋ฐ๊พธ๊ณ , ํด๋ฆญ ์ดํํธ์ธ ripple effect๊ฐ ์ ์ฉ๋์ด ์๋ card composable function์ ์ฌ์ฉํด ์ฃผ์๋ค.
์ด ๋ถ๋ถ๋ ์ฌ๋ฌ๋ถ์ ์ทจํฅ์ ๋ฐ๋ผ ๋ง์ฝ ripple effect๊ฐ ํ์ํ์ง ์์ ๊ฒฝ์ฐ์๋ box composable function์ ์ด์ฉํด modifier clickable์ ์ด์ฉํด๋ ๋๋ค.
๋ํ elevation์ด 0dp์ธ๋ฐ ์ param์ ์ ์ํด ๋์๋๋ฉด card์ ๊ธฐ๋ณธ์ ์ผ๋ก 1dp๊ฐ ์ ์ฉ๋์ด ์๋๋ฐ ํ์๋ elevation์ด ์๋ checkbox๋ฅผ ๋ง๋ค๊ณ ์ถ์๋ค.
card ํน์ box๋ก ํ์ ๋ง๋ค์ด์ฃผ๊ณ ๋๋ฉด content ์์ ์์ ์์ฑํ checkBoxState๋ฅผ ์ด์ฉํด state์ ๋ฐ๋ผ ์ด์ ์ ๋ง๋ค์ด๋ ui๋ก ๋ณ๊ฒฝ๋๊ฒ ํด ์ฃผ์๋ค.
3. ์คํ ํ๋ฉด
์คํ ํ๋ฉด์ ๋ณด์(์ผ์ชฝ์ด custom, ์ค๋ฅธ์ชฝ์ด basic)
ํน์ ๊ถ๊ธํดํ ์ฌ๋ฌ๋ถ๋ค์ ์ํด ์ฝ๋๋ ์ฌ๋ ค์ฃผ๊ฒ ๋ค.
var checkState by remember { mutableStateOf(true) }
var basicCheckState by remember { mutableStateOf(false) }
Row {
DotoriCheckBox(
modifier = Modifier.padding(40.dp),
checked = checkState,
onCheckedChange = { checkState = it }
)
Checkbox(
modifier = Modifier.padding(top = 40.dp),
checked = basicCheckState,
onCheckedChange = { basicCheckState = !basicCheckState }
)
}
Text(
modifier = Modifier.fillMaxWidth(),
text = "checkbox checkState: $checkState",
style = DotoriTheme.typography.body,
textAlign = TextAlign.Center,
color = DotoriTheme.colors.neutral10
)
์ฐธ๊ณ ๋ก ์ ์ฒด ์ฝ๋๊ฐ ์๋๊ณ checkbox ์ชฝ ์ฝ๋์ด๋ค(์ฌ์ค ์ ์ฒด๋ผ๊ณ ํด๋ดค์ ๊ทธ๋ฅ row ๋ฐ์ column๋ฐ์ ๋ฌ ๊ฒ ์๋ค ใ ใ ;;)
์ ๋ฆฌ
- ์ด๋ ๊ฒ custom checkbox๋ฅผ ๋ง๋ค์ด ๋ณด์๋๋ฐ ์๊ฐ๋ณด๋ค ์ฝ๋ค! ์ฌ๋ฌ๋ถ๋ค๋ ํ ์ ์๋ค!
- ํ์ฌ ํฌ์คํ
์ checkbox์ ๋ํ ์ค๋ช
์ ์ํด ์ฝ๋ ๊ธฐ๋ฅ์ ๋ถ๋ถ์ ์ค๋ช
์ ์ ํ๋๋ฐ ๊ถ๊ธํ ๊ฒ์ด ์์ผ๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์๋ฉด ์ต๋ํ ๋น ๋ฅด๊ฒ ๋ต๋ณํด ๋๋ฆฌ๊ฒ ์ต๋๋ค.(์ฌ์ค
๊ธฐ๋ฅ์ ์ธ ๋ถ๋ถ๋ ๋ณ๋ก ์๋ค ใ ใ ) - ์ด ๋ฐฉ๋ฒ ๋ง๊ณ ๋ ๋ ์ข์ ๋ฐฉ๋ฒ์ด๋ ๋ ๋ค๋ฅธ ์๊ฐ์ ๊ฐ์ง๊ณ ๊ณ์ ๋ถ๋ค๋ ๋๊ธ๋ก ์๋ ค์ฃผ์๋ฉด ํ์์๊ฒ๋ ์ข์ ๊ณต๋ถ๊ฐ ๋ ๊ฒ ๊ฐ๋ค XD
'๐ฑ| Android > ๐ | Jetpack' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Android, Kotlin] jetpack navigation์์ safe args๋ก ๋ฐ์ดํฐ ์ ๋ฌํ๊ธฐ (0) | 2023.09.26 |
---|---|
[Android, Kotlin] compose custom theme ๋ง๋ค๊ธฐ (0) | 2023.08.18 |
[Android, Kotlin] compose๋ก tablayout ๊ตฌํํ๊ธฐ (2) | 2023.08.15 |
[Android, Kotlin] compose navigation์์ data class tpye ๋๊ธฐ๊ธฐ (2) | 2023.08.11 |
[Android, Kotlin] compose์์ api ํต์ ํ๊ธฐ (2) | 2023.08.03 |