React Native Lottie - 动画结束后反转

React Native Lottie - Upon Animation End Reverse

上下文

我是 lottie-react-native 的新手,已经成功实现了我的第一个动画:

constructor(props) {
    super(props);
    this.state = {
        progress: new Animated.Value(0),
        loop: true
    }
}
componentDidMount() {
    this.animation.play();
}
render() {
const { progress, loop } = this.state;
return (
    <View style={{display:'flex',height:'auto', alignItems: 'center',justifyContent:'center'}}>
    <LottieView
    ref={animation => {
        this.animation = animation;
      }}
    speed={1}
    autoPlay
    source={NOACTIVITY}
    progress={progress}
    loop={loop}
    height={300}
    width={300}
    style={{margin:0,}}
  />
  </View>
)

}

问题

我现在正尝试用这个动画创建一个循环,向前播放,然后向后播放,然后再次开始这个过程。

我做了一些研究并得出结论,这必须使用动画值和时间来完成?我发现了很多向前和向后但不是一起玩的例子(in the react native docs!)。

这可以在挂载的组件上完成吗?还是它必须是一个单独的函数?

提前致谢!

因此,您可以做的一件事是对 this.state.progress 使用 Animated.loop(),然后在每次迭代时反转动画的速度。

AnimateFunction = () => {
  Animated.loop(
    Animated.timing(
      this.state.progress,
      {
        toValue: 1,
        duration: (your duration of anim),
        easing: Easing.linear()
      }
    )
  ).start(
    () => {
      this.animation.setSpeed(this.animation.speed * -1);
    }
  );
}

然后将您的 componentDidMount 更改为:

componentDidMount() {
  this.AnimateFunction();
}

未经测试我不确定,但您可能需要在设置速度的同时重置 this.state.progress.setValue(0) 在每个循环之后。请记住这一点,以防它一开始不起作用。

虽然我很想看看你是否有和我一样的以下问题。当我出于某种原因在 React Native 中循环 lottie 动画时,它们会在循环之间暂停......无论如何希望这对你有用

我想出的解决方案是在循环中使用一个序列,如下所示:

AnimateFunction = () => {
    Animated.loop(
        Animated.sequence([
            Animated.timing(
                this.state.progress,
                {
                  toValue: 1,
                  duration: (5000),
                  //easing: Easing.linear()
                }
              ),
              Animated.timing(
                this.state.progress,
                {
                  toValue: 0,
                  duration: (5000),
                  //easing: Easing.linear()
                }
              )
        ])

    ).start();
  }

我发现当应用程序从 0 处重新启动时,添加缓动会使动画跳动一点,因此暂时将其注释掉。

更好更干净的解决方案

const defaultEvent = {
    eventName: 'complete',
    callback: () => {
        alert("loopComplete")
       /*Insert your handlers here*/
    },
};

然后在您的 Lottie 组件上:

<Lottie
    options={defaultOptions}
    height={400}
    width={400}
    eventListeners={[defaultEvent]}
/>

您可以使用的事件名称:completeloopCompleteenterFramesegmentStartconfig_readydata_readyloaded_imagesDOMLoadeddestroy

(编辑)后来我读到这是针对 react-native 的,很遗憾,我很抱歉,这是一个 react-js 解决方案

onAnimationFinish 可以在动画完成时使用

<LottieView
          ref={(el) => {
            lottie = el;
          }}
          autoPlay={false}
          loop={false}
          style={styles.lottie}
          source={animationFile}
          enableMergePathsAndroidForKitKatAndAbove
          onAnimationFinish={onAnimationFinish}
        />