mirror of
https://github.com/divkit/divkit.git
synced 2026-06-06 20:07:59 +00:00
099c02b37d
commit_hash:1a2c686df21e57ae95ad975dcaf1c41ab0fcdabb
55 lines
1.7 KiB
Swift
55 lines
1.7 KiB
Swift
import Foundation
|
|
import LayoutKit
|
|
import VGSL
|
|
|
|
extension DivAnimation {
|
|
func resolveAnimations(
|
|
expressionResolver: ExpressionResolver,
|
|
animationNameToKind: (DivAnimation.Name) -> TransitioningAnimation.Kind?,
|
|
defaultStartValue: (TransitioningAnimation.Kind) -> Double,
|
|
defaultEndValue: (TransitioningAnimation.Kind) -> Double,
|
|
invertResolvedStartAndEnd: Bool = false
|
|
) -> [TransitioningAnimation] {
|
|
let name = resolveName(expressionResolver) ?? .noAnimation
|
|
if name == .set {
|
|
return (items ?? []).flatMap {
|
|
$0.resolveAnimations(
|
|
expressionResolver: expressionResolver,
|
|
animationNameToKind: animationNameToKind,
|
|
defaultStartValue: defaultStartValue,
|
|
defaultEndValue: defaultEndValue,
|
|
invertResolvedStartAndEnd: invertResolvedStartAndEnd
|
|
)
|
|
}
|
|
}
|
|
|
|
guard let kind = animationNameToKind(name) else {
|
|
return []
|
|
}
|
|
|
|
let originalStart = self.resolveStartValue(expressionResolver)
|
|
let originalEnd = self.resolveEndValue(expressionResolver)
|
|
let startValue: Double?
|
|
let endValue: Double?
|
|
|
|
if invertResolvedStartAndEnd {
|
|
startValue = originalEnd
|
|
endValue = originalStart
|
|
} else {
|
|
startValue = originalStart
|
|
endValue = originalEnd
|
|
}
|
|
|
|
let animation = TransitioningAnimation(
|
|
kind: kind,
|
|
start: startValue ?? defaultStartValue(kind),
|
|
end: endValue ?? defaultEndValue(kind),
|
|
duration: TimeInterval(milliseconds: resolveDuration(expressionResolver)),
|
|
delay: TimeInterval(milliseconds: resolveStartDelay(expressionResolver)),
|
|
timingFunction: resolveInterpolator(expressionResolver).asTimingFunction()
|
|
)
|
|
|
|
return [animation]
|
|
}
|
|
}
|