UNPKG

@shopify/react-native-skia

Version:

High-performance React Native Graphics using Skia

63 lines (58 loc) 1.95 kB
import type { TimingConfig, RequiredAnimationParams, AnimationCallback, } from "../types"; import type { AnimationState, SkiaMutableValue } from "../../values/types"; import { ValueApi } from "../../values/api"; import { timing } from "./functions"; /** * Creates an animation that is driven by a clock value. * The value will be run from / to the value in params and modified * by the provided easing curve for the length of the duration. When * the value has reached its desired "to" value the animation * will be stopped. If loop is set to true, the animation will continue * to run until stopped. * * @param params Animation parameters * @param config Spring or timing configuration * @param value Optional value that the animation will update * @params an animation value that can be used to start/stop * the animation. */ export const createTiming = ( params: RequiredAnimationParams & Required<TimingConfig>, value?: SkiaMutableValue<number>, callback?: AnimationCallback ) => { // Update from to be either the declared from value, // the current value of the value or zero const resolvedParams = { ...params, from: params.from ?? value?.current ?? 0, }; // Update function for the animation value const animationFunction = (t: number, state: AnimationState | undefined) => { // Update the input value using the provided update function const nextState = timing( t, params.duration, params.easing, params.loop ?? false, params.yoyo ?? false, state ?? { current: params.from!, finished: false } ); const current = nextState.current * (resolvedParams.to - resolvedParams.from!) + resolvedParams.from!; if (callback && nextState.finished === true) { callback(current); } return { ...nextState, current, }; }; // Create animation value return ValueApi.createAnimation(animationFunction); };