@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))