[Jetpack Compose] (Interface) Animation

유민국·2024년 10월 18일
@JvmDefaultWithCompatibility
interface Animation<T, V : AnimationVector> {
    // 애니메이션의 지속시간(나노초 단위)
    @get:Suppress("MethodNameUnits")
    val durationNanos: Long
    // 애니메이션의 현재 값을 다른 타입으로 변환하는 데 사용되는 변환기 
    // AnimationVector 참고
    val typeConverter: TwoWayConverter<T, V>
    val targetValue: T
    val isInfinite: Boolean

	// playTimeNanos에 해당하는 애니메이션 value을 반환
    // playTimeNanos: 재생 시간
    fun getValueFromNanos(playTimeNanos: Long): T
    fun getVelocityVectorFromNanos(playTimeNanos: Long): V
    fun isFinishedFromNanos(playTimeNanos: Long): Boolean {
        return playTimeNanos >= durationNanos
    }
}

interface Animation은 특정 애니메이션 사양(vectorizedAnimationSpec 또는 FloatDecayAnimationSpec)에서 애니메이션 값을 조회할 때 재생 시간(playTimeNanos)만 요구하여 편리한 쿼리를 제공한다

ex) 2초 동안 직선으로 이동하는 애니메이션
시작 위치: (0, 0) - initialValue
종료 위치: (100, 100) - targetValue
지속 시간: 2초

// 1초(1_000_000_000 나노초)에 해당하는 (50, 50)을 반환 
val currentValue = animation.getValueFromNanos(1_000_000_000) 

즉, 현재 재생 시간을 전달하면 내부적으로 초기값과 목표값을 고려하여 현재 애니메이션 값을 계산하고 반환시켜준다

interface Animation은 애니메이션의 생명주기를 관리하지 않기 때문에 생명주기를 인식하는 애니메이션을 구축하는 기본 요소로 사용된다.

확장

// 나노초가 아닌 밀리초로 변환
internal val Animation<*, *>.durationMillis: Long
    get() = durationNanos / MillisToNanos

// playTimeNanos에 따른 애니메이션의 velocity를 반환
fun <T, V : AnimationVector> Animation<T, V>
.getVelocityFromNanos(playTimeNanos: Long): T =
    typeConverter
    .convertFromVector(getVelocityVectorFromNanos(playTimeNanos))

Animation을 상속 받은 구현체

TargetBasedAnimation
DecayAnimation

profile
안녕하세요 😊

0개의 댓글