【问题标题】:Accessing methods when using react-bodymovin to loop animation segments使用 react-bodymovin 循环动画片段时的访问方法
【发布时间】:2019-11-25 23:22:45
【问题描述】:

我正在使用 react-bodymovin 包 (https://www.npmjs.com/package/react-bodymovin) 嵌入 Bodymovin 动画,但我想在动画播放一次后循环播放一段动画。

我可以看到使用 HTML 版本的 Bodymovin 很简单,因为您只需使用相关方法即可,例如(假设 div 的 ID 为 bodymovin

const params = {
    container: document.getElementById('bodymovin'),
    renderer: 'svg',
    loop: false,
    autoplay: false,
    animationData: animationData,
}

const anim = bodymovin.loadAnimation(params)

anim.playSegments([[0, 65]], true)

但是,我不确定在使用 React 组件时如何访问这些相同的方法。 这是我的组件:

import React from 'react'
import ReactBodymovin from 'react-bodymovin'
import animation from './animation.json'

const App = () => {
  const bodymovinOptions = {
    loop: true,
    autoplay: true,
    prerender: true,
    animationData: animation
  }

  return (
    <div>
      <ReactBodymovin options={bodymovinOptions} />
    </div>
  )
}

我有一种感觉,由于这个 React 包装器与 Bodymovin 一起工作的方式的性质,可能无法访问文件中的方法,但如果有人知道这样做的方法,我很想听听它。谢谢。

【问题讨论】:

  • 这看起来很有趣,你能不能让 HTML 的 stackblitz 只有不反应,从来没有使用过 bodymovin 所以我真的不知道你在找什么

标签: reactjs lottie bodymovin


【解决方案1】:

你为什么不试试react-lottie 包呢?它的 npm-downloads 比 react-bodymovin 多得多,你可以实现你想要的并播放这样的片段:

import React from 'react'
import animation from './animation.json'

import Lottie from 'react-lottie';

const App = () => {
  const options= {
    loop: true,
    autoplay: true,
    prerender: true,
    animationData: animation
  }

  return (
    <div>
      <Lottie options={options} segments={[0, 65]} />
    </div>
  )
}

但是,对于这两个包,您将无法完全控制 lottie 对象,因此无法手动调用 loadAnimationloadSegments 等方法。但是,您可以像在普通 javascript 中那样使用 lottie-web 包,正如您所展示的那样。这是一个示例,您应该如何使用钩子做出反应:

import React, { useEffect, useRef } from "react";
import lottie from "lottie-web";
import animation from "./animation.json";

const App = () => {
 const animContainer = useRef<HTMLDivElement>(null);

 useEffect(() => {
    if (ref.current) {
      const anim = lottie.loadAnimation({
        container: animContainer.current,
        renderer: "svg",
        loop: true,
        autoplay: true,
        animationData: animation
      });

     anim.playSegments([[0, 65]], true);
    }
  });

  return <div ref={animContainer}></div>;
}

【讨论】:

  • 感谢您的回复,实际上我确实移到了 Lottie 插件,但即使在您的示例中设置了segments 属性,动画也会从头到尾播放,而不是循环播放某个部分。跨度>
  • 嗯,这很不幸,lottie-web 的另一个示例是否仅适用?已经有一个与此相关的问题:github.com/chenqingspring/react-lottie/issues/82 如果您愿意,可以创建一个新问题来解决此问题。
  • 不,那也没用,所以我会尽力让 Lottie 团队知道。感谢 oemera 的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
  • 2022-06-19
  • 1970-01-01
相关资源
最近更新 更多