[Jetpack Compose] AnimationState

유민국·2024년 10월 18일

같이 보기
Animatable

AnimationState

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
)
profile
안녕하세요 😊

0개의 댓글