레이아웃에서 콘텐츠 변경 사항을 애니메이션 처리
애니메이션이 상태 기반인 경우이고 컴포지션 도중
애니메이션 시간을 세밀하게 관리 - Animation
애니메이션이 유일한 정보 소스 - Animatable
그 외 - AnimationState, animate
Animation 상태 관찰
MutableTransitionState를 통해 현재 애니메이션의 진행 상태 정보를 얻을 수 있음
애니메이션 추가
AnimatedVisibility의 transition 속성을 이용.
위 예제에선 Box background를 추가적으로 애니메이션 처리.
animateAsState
- 단일 값을 애니메이션 처리하는 가장 간단한 API
Animatable
- 값이 animateTo를 통해 변경될 때 값을 애니메이션으로 표현
- 많은 기능들이 정지 함수로 제공되므로 적절한 코루틴 범위에 매핑
animateTo는 정지 함수이므로 값 변경 중에 진행되던 애니메이션은 취소되고 새로운 애니메이션 시작
updateTransition
- Transition: 하나 이상의 애니메이션을 하위 요소로 관리하고 동시 실행
- AnimatedVisibility와 AnimatedContent를 확장 함수로 사용 가능
selected 속성을 updateTransition을 통해 Transition으로 관리하며, Surface 내에서 AnimatedVisibility와 AnimatedContent를 동시 실행
rememberInfiniteTransition
- Transition같이 하나 이상의 애니메이션이 포함되지만 컴포지션 시작 시 애니메이션 시작하며 삭제되지 않으면 중단하지 않음
TargetBasedAnimation
val value by animateFloatAsState(
targetValue = 1f,
animationSpec = tween(
durationMillis = 300,
delayMillis = 50,
easing = LinearOutSlowInEasing
)
)
-> LinearOutSlowInEasing 효과를 사용하며 50ms 이후 300ms동안 1f로 애니메이션.
val value by animateFloatAsState(
targetValue = 1f,
animationSpec = spring(
dampingRatio = Spring.DampingRatioHighBouncy,
stiffness = Spring.StiffnessMedium
)
)
-> 높은 Bounce 효과, StiffnessMediun 속도로 1f로 애니메이션
val value by animateFloatAsState(
targetValue = 1f,
animationSpec = keyframes {
durationMillis = 375
0.0f at 0 with LinearOutSlowInEasing // for 0-15 ms
0.2f at 15 with FastOutLinearInEasing // for 15-75 ms
0.4f at 75 // ms
0.4f at 225 // ms
}
)
-> 375ms동안 0ms~15ms는 LinearOutSlowInEasing 효과로,
15ms~75ms는 FastOutLinearInEasing효과로,
75ms ~ 375ms는 기본 효과로 애니메이션
val value by animateFloatAsState(
targetValue = 1f,
animationSpec = repeatable(
iterations = 3,
animation = tween(durationMillis = 300),
repeatMode = RepeatMode.Reverse
)
)
-> Reverse효과로 3번 tween 애니메이션 반복
infiniteRepeatable: 무한 반복되는 애니메이션 효과
snap: 목표 값으로 애니메이션을 즉시 완료
+) TwoWayConverter: AnimationVector로 변경해 주는 역할