728x90
반응형
LazyColumn, LazyRow의 특징 및 사용
LazyColumn, LazyRow 특징스크롤 가능한 리스트내부적으로 Cloumn, Row과 비슷, 스크롤 기능이 내장됨별도의 ScrollView 없이 리스트 생성 가능지연(Lazy) 로딩 최적화화면에 보이는 항목만 렌더링 하며, 보
joyshu93.tistory.com
이 글에는 위 포스팅의 내용이 포함되어 있습니다
버튼을 아이콘으로 대체
- Icon과 함께 IconButton 컴포저블 사용
- Icons.Filled.ExpandLess와 Icons.Filled.ExpandMore를 사용
material-icons-extended 아티팩트를 종속 추가
implementation("androidx.compose.material:material-icons-extended")
문자열 리소스 사용
app/src/res/values/strings.xml에 리소스 추가
<string name="show_less">Show less</string>
<string name="show_more">Show more</string>
- 항목을 확장/축소할 때 사용하게 될 리소스
Card 컴포저블 사용 및 animateContentSize 사용
- extraPadding을 삭제하고 animateContentSize 수정자를 Row에 적용 + coerceAtLeast 삭제
- 애니메이션 생성 프로세스가 자동화됨
- Card 컴포저블 추가
전체 코드
package com.example.basicscodelab
import ...
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
BasicsCodelabTheme {
MyApp(modifier = Modifier.fillMaxSize())
}
}
}
}
@Composable
fun MyApp(modifier: Modifier = Modifier) {
var shouldShowOnboarding by rememberSaveable { mutableStateOf(true) }
Surface(modifier, color = MaterialTheme.colorScheme.background) {
if (shouldShowOnboarding) {
OnboardingScreen(onContinueClicked = { shouldShowOnboarding = false })
} else {
Greetings()
}
}
}
@Composable
fun OnboardingScreen(
onContinueClicked: () -> Unit,
modifier: Modifier = Modifier
) {
Column(
modifier = modifier.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text("Welcome to the Basics Codelab!")
Button(
modifier = Modifier.padding(vertical = 24.dp),
onClick = onContinueClicked
) {
Text("Continue")
}
}
}
@Composable
private fun Greetings(
modifier: Modifier = Modifier,
names: List<String> = List(1000) { "$it" }
) {
LazyColumn(modifier = modifier.padding(vertical = 4.dp)) {
items(items = names) { name ->
Greeting(name = name)
}
}
}
@Composable
private fun Greeting(name: String, modifier: Modifier = Modifier) {
Card( //Card 적용
colors = CardDefaults.cardColors(
containerColor = MaterialTheme.colorScheme.primary
),
modifier = modifier.padding(vertical = 4.dp, horizontal = 8.dp)
) {
CardContent(name)
}
}
@Composable
private fun CardContent(name: String) {
var expanded by rememberSaveable { mutableStateOf(false) }
Row( //Row 적용
modifier = Modifier
.padding(12.dp)
.animateContentSize(
animationSpec = spring(
dampingRatio = Spring.DampingRatioMediumBouncy,
stiffness = Spring.StiffnessLow
)
)
) {
Column(
modifier = Modifier
.weight(1f)
.padding(12.dp)
) {
Text(text = "Hello, ")
Text(
text = name, style = MaterialTheme.typography.headlineMedium.copy(
fontWeight = FontWeight.ExtraBold
)
)
if (expanded) {
Text(
text = ("Composem ipsum color sit lazy, " +
"padding theme elit, sed do bouncy. ").repeat(4),
)
}
}
IconButton(onClick = { expanded = !expanded }) { // IconButton으로 대체
Icon(
imageVector = if (expanded) Filled.ExpandLess else Filled.ExpandMore,
contentDescription = if (expanded) {
stringResource(R.string.show_less)
} else {
stringResource(R.string.show_more)
}
)
}
}
}
@Preview(
showBackground = true,
widthDp = 320,
uiMode = UI_MODE_NIGHT_YES,
name = "GreetingPreviewDark"
)
@Preview(showBackground = true, widthDp = 320)
@Composable
fun GreetingPreview() {
BasicsCodelabTheme {
Greetings()
}
}
@Preview(showBackground = true, widthDp = 320, heightDp = 320)
@Composable
fun OnboardingPreview() {
BasicsCodelabTheme {
OnboardingScreen(onContinueClicked = {})
}
}
@Preview
@Composable
fun MyAppPreview() {
BasicsCodelabTheme {
MyApp(Modifier.fillMaxSize())
}
}
728x90
반응형
'안드로이드 학습(Compose)' 카테고리의 다른 글
이미지, 텍스트로 아이템 디자인 (0) | 2025.03.06 |
---|---|
검색창 레이아웃 생성 (0) | 2025.03.06 |
앱의 스타일 지정 및 테마 설정 (0) | 2025.03.05 |
목록에 애니메이션 적용 (0) | 2025.03.05 |
기기 회전과 상태 유지 (0) | 2025.03.04 |