같이 보기
Animatable
class AnimationState<T, V : AnimationVector>(
val typeConverter: TwoWayConverter<T, V>,
// 애니메이션의 초기값
initialValue: T,
// 애니메이션 초기 속도 벡터
initialVelocityVector: V? = null,
// 마지막 애니메이션 프레임이 업데이트된 시간(나노초단위)
// 이를 통해 애니메이션의 시간 흐름을 추적할 수 있다
lastFrameTimeNanos: Long = AnimationConstants.UnspecifiedTime,
// 애니메이션이 종료된 시간(나노초단위)
// 애니메이션이 언제 완료되었는지를 추적하기 위해 사용
// 아직 애니메이션이 종료되지 않았다면
// AnimationConstants.UnspecifiedTime(= Long.MIN_VALUE)값을 가진다
finishedTimeNanos: Long = AnimationConstants.UnspecifiedTime,
isRunning: Boolean = false
) : State<T> {
override var value: T by mutableStateOf(initialValue)
internal set
// 만약 initialVelocityVector를 넣어주지 않는다면,
// 벡터 값이 reset(각 속성값 0f)된다
var velocityVector: V =
initialVelocityVector?.copy()
?: typeConverter.createZeroVectorFrom(initialValue)
internal set
// 애니메이션의 마지막 프레임 시간
// 해당 값은 AnimationState의 animateTo 메서드에서 순차 애니메이션을
// 시작하는 데 사용
// 이는 순차 애니메이션이 이전 애니메이션이 중단되거나
// 종료된 시간에 시작 시간을 설정할 수 있도록 한다
@get:Suppress("MethodNameUnits")
var lastFrameTimeNanos: Long = lastFrameTimeNanos
internal set
// 애니메이션이 성공적으로 완료된 시간
@get:Suppress("MethodNameUnits")
var finishedTimeNanos: Long = finishedTimeNanos
internal set
var isRunning: Boolean = isRunning
internal set
val velocity: T
get() = typeConverter.convertFromVector(velocityVector)
override fun toString(): String {
return "AnimationState(" +
"value=$value, " +
"velocity=$velocity, " +
"isRunning=$isRunning, " +
"lastFrameTimeNanos=$lastFrameTimeNanos, " +
"finishedTimeNanos=$finishedTimeNanos" +
")"
}
}
애니메이션의 상태(프레임 시간, 초기 값, 초기 속도 등)를 관리하기 위한 클래스.
애니메이션이 실행,중단,완료 등을 추적한다
Animatable클래스 안에 AnimationState를 통해 애니메이션 상태를 가지고 있다
AnimationState는 애니메이션의 상태와 세부 사항을 관리하는 데 중점을 두며Animatable은 애니메이션 값을 직접적으로 조작하고 변경하는 데 중점을 둔다고 생각된다
📌 예시로 Animatable의 일부를 살펴보자
...
// Animatable안에 internalState를 가지고 있으며 value나 velocityVector등을
// AnimationState를 통해 받아오고 있는걸 확인할 수 있다
// Animatable안의 함수들 또한 AnimationState를 사용하고 있다
internal val internalState = AnimationState(
typeConverter = typeConverter,
initialValue = initialValue
)
val value: T
get() = internalState.value
val velocityVector: V
get() = internalState.velocityVector
...
// Animatable의 함수들이 반환하는 AnimationResult 또한
// AnimationState를 포함하고 있는걸 확인할 수 있다
class AnimationResult<T, V : AnimationVector>(
// 애니메이션이 취소되거나 재설정되기 전 마지막 프레임에서의 애니메이션 상태
// 중단 시점의 애니메이션 값, 속도, 프레임 시간 등을 캡처하여
// 애니메이션이 성공적으로 완료될 때 속도가 재설정되기 전의 상태를 나타낸다
val endState: AnimationState<T, V>,
// 애니메이션이 종료된 이유를 나타낸다
// Finished: 애니메이션이 중단 없이 성공적으로 종료될 때
// BoundReached: 애니메이션이 어느 한 차원에서 lowerBound 또는
// Animatable.upperBound에 도달하면,
// BoundReached를 종료 이유로 하여 끝낸다
val endReason: AnimationEndReason
)