아래의 코드를 기반으로 만듦!
https://github.com/google-developer-training/basic-android-kotlin-compose-training-woof/tree/starter
implementation("androidx.compose.material:material-icons-extended")
IconButton
컴포저블 사용@Composable
private fun DogItemButton(
expanded: Boolean,
onClick: () -> Unit,
modifier: Modifier = Modifier
){
// 해당 아이콘을 클릭할 수 있게 만듦
IconButton(
onClick = onClick,
modifier = modifier
) {
Icon(
if (expanded) Icons.Filled.ExpandLess else Icons.Filled.ExpandMore,
contentDescription = stringResource(R.string.expand_button_content_description),
tint = MaterialTheme.colorScheme.secondary
)
}
}
DogItem()
에 확장 상태를 저장하는 변수 추가var expanded by remember { mutableStateOf(false) }
DogItem()
컴포저블의 Row
블록 끝에 있는 DogInformation()
호출 뒤에 DogItemButton()
을 추가DogItemButton(
expanded = expanded,
onClick = { /* TODO */ },
)
DogInformation()
과DogItemButton()
사이에 아래의 코드 추가Spacer(modifier = Modifier.weight(1f))
아래와 같이 정렬
@Composable
fun DogHobby(
@StringRes dogHobby: Int,
modifier: Modifier = Modifier
) {
Column(
modifier = modifier
) {
Text(
text = stringResource(R.string.about),
style = MaterialTheme.typography.labelSmall
)
Text(
text = stringResource(dogHobby),
style = MaterialTheme.typography.bodyLarge
)
}
}
Row
뒤에 DogHobby()
를 Column
의 두 번째 하위 요소로 추가DogHobby(
dog.hobbies, modifier = Modifier.padding(
start = dimensionResource(R.dimen.padding_medium),
top = dimensionResource(R.dimen.padding_small),
bottom = dimensionResource(R.dimen.padding_medium),
end = dimensionResource(R.dimen.padding_medium)
)
)
DogItem()
함수의 DogItemButton()
함수 호출에서 onClick()
람다 표현식을 정의DogItemButton(
expanded = expanded,
onClick = { expanded = !expanded },
)
DogBoddy()
함수 호출 부분을 if문으로 감싸기// 확장 상태일 때만 노출
if (expanded) {
DogHobby(
dog.hobbies, modifier = Modifier.padding(
start = dimensionResource(R.dimen.padding_medium),
top = dimensionResource(R.dimen.padding_small),
bottom = dimensionResource(R.dimen.padding_medium),
end = dimensionResource(R.dimen.padding_medium)
)
)
}
DogItemButton()
함수에서 expanded 상태에 따라 imageVector 값을 업데이트하는 if 문을 추가IconButton(
onClick = onClick,
modifier = modifier
) {
Icon(
// 추가
if (expanded) Icons.Filled.ExpandLess else Icons.Filled.ExpandMore,
contentDescription = stringResource(R.string.expand_button_content_description),
tint = MaterialTheme.colorScheme.secondary
)
}
DogItem()
에서 Column
레이아웃에 modifier
매개변수를 추가animateContentSize
를 추가해 크기(목록 항목 높이) 변경을 애니메이션 처리DampingRatioNoBouncy
를 사용하여 스프링 애니메이션으로 설정되므로 반동력이 없음StiffnessMedium
매개변수는 스프링의 강성을 약간 더 높임Column(
modifier = Modifier
.animateContentSize(
animationSpec = spring(
dampingRatio = Spring.DampingRatioNoBouncy,
stiffness = Spring.StiffnessMedium
)
)
)
https://github.com/MinchaeKwon/AndroidCompose/tree/master/Chapter3/Woof
위에서 연습한 것을 토대로 간단한 앱을 만들어 보았다!
https://github.com/MinchaeKwon/AndroidCompose/tree/master/Chapter3/Superheroes