🤖 Compose

[Compose] Animation

콩드로이드 2025. 1. 8. 20:04

AnimatedVisibility

- visibility에 Animated 적용

- Transition이 enter, exit 따로 나눠져있다


- FadeTransition:  나타날 때, 사라질 때 투명도를 조절해 부드럽게 변하는 효과
- SlideTransition:  화면의 한 쪽에서 다른 쪽으로 이동하며 나타나고 사라지는 효과
- ExpandTransition:  펼쳐지거나 축소되며 나타나고 사라지는 효과, 주로 패널이나 리스트 항목에 사용
- ScaleTransition:  크기를 확대하거나 축소하면서 나타나거나 사라지는 효과

 

이런 식으로 사용 ..! textVisible은 아래와 같이 선언되어있다 

var textVisible by remember { mutableStateOf(false) }

 

AnimatedVisibility(
    visible = textVisible,
    enter = expandHorizontally(),
    exit = shrinkHorizontally()
) {
    Text("Animation Test")
}


Row(
    modifier = Modifier.selectable(
        selected = textVisible,
        onClick = {
            textVisible = true
        }
    ),
    verticalAlignment = Alignment.CenterVertically
) {
    RadioButton(
        selected = textVisible,
        onClick = {
            textVisible = true
        }
    )

    Text(text = "본다")
}

Row(
    modifier = Modifier.selectable(
        selected = !textVisible,
        onClick = {
            textVisible = false
        }
    ),
    verticalAlignment = Alignment.CenterVertically
) {
    RadioButton(
        selected = !textVisible,
        onClick = {
            textVisible = false
        }
    )

    Text(text = "안 본다")
}

 

 

만약, 컬러를 변경시키고 싶다면 

val bgColor by animateColorAsState(
    targetValue = if(isDefault) Color(0xffcecece) else Color(0xff0094ff), 
    label = ""
)

 

위와 비슷한 두 개의 row를 눌러가며 테스트 해볼 수 있다 

Row(
    modifier = Modifier.selectable(
        selected = isDefault,
        onClick = {
            isDefault = true
        }
    ),
    verticalAlignment = Alignment.CenterVertically
) {
    RadioButton(
        selected = isDefault,
        onClick = {
            isDefault = true
        }
    )

    Text(text = "default")
}

Row(
    modifier = Modifier.selectable(
        selected = !isDefault,
        onClick = {
            isDefault = false
        }
    ),
    verticalAlignment = Alignment.CenterVertically
) {
    RadioButton(
        selected = !isDefault,
        onClick = {
            isDefault = false
        }
    )

    Text(text = "blue")
}

 

 

Crossfade

Crossfade는 두 개의 UI 요소 간에 부드러운 전환 효과, 주로 상태에 따라 서로 다른 UI를 표시할 때 사용된다

좀 더 다이나믹한 UI 애니메이션 표시할 때 주로 사용 

@Composable
fun MyCrossfadeExample() {
    var isFirstState by remember { mutableStateOf(true) }

    Column(
        modifier = Modifier.fillMaxSize(),
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        // Crossfade를 사용하여 상태에 따라 UI 전환
        Crossfade(
            targetState = isFirstState,
            label = "text crossfade") 
        { state ->
            if (state) {
                Text("첫 번째 상태", modifier = Modifier.padding(16.dp))
            } else {
                Text("두 번째 상태", modifier = Modifier.padding(16.dp))
            }
        }

        // 상태 변경 버튼
        Button(onClick = { isFirstState = !isFirstState }) {
            Text("상태 변경")
        }
    }

 

'🤖 Compose' 카테고리의 다른 글

[Compose] State, StateHoisting  (0) 2025.01.07
[Compose] Snackbar  (0) 2025.01.07
[Compose] ConstraintLayout, ConstraintSet  (0) 2025.01.07
[Compose] Recomposition  (0) 2025.01.06
[Compose] scaffold  (0) 2025.01.06