react-konva - 运行 同时进行精灵动画和滤镜

react-konva - running sprite animation and filter at the same time

总而言之,我无法同时为 Konva 精灵设置动画并应用 Konva 滤镜。

我正在使用 react-konva 绘制一个复杂的舞台,其中部分包含使用 Sprite 组件动画的动画图像。为了启动动画,我一直等到节点在浏览器中被绘制出来,有点“hack”(setTimeout),然后在每个节点上调用 shape.start() 来启动它们。

    initiateAnimations = () => {
       setTimeout(() => {
           let stage = this.stageRef.getStage();  
           var shapes = stage.find('.canvas-animation');
           shapes.map(shape => {
               shape.start();
           })
       },100)      
   }

我还为这些图像添加了颜色叠加层,这取决于我在渲染之前输入到 Sprite 组件中的属性。我为此使用了 Konva RGBA 滤镜 - 它并不完美,但可以完成工作。为了启动和绘制过滤器,Konva 需要重新缓存图像,因此在 render() 中绘制节点后,我为此使用了缓存和 batchDraw 函数。

   applyEffects = () => {
       setTimeout(() => {
           let stage = this.stageRef.getStage();
           var shapes = stage.find(node => { return node.attrs.id.includes("-f1") ? true : false; });
           shapes.map(shape => {
               this.applyCache(shape)
           })
       },100)      
   }

   applyCache(target) {
       target.cache();
       target.getLayer().batchDraw();
   }

我在 componentDidMount 和 componentDidUpdate 中都有所有这些。

我遇到的问题是动画和滤镜各自工作,但从来没有一起工作,无论时间延迟或它们的顺序如何。结合起来,只有过滤器将起作用。另一方面,如果我 运行 只有动画脚本,动画会启动并且 运行 很好。但是在一起,动画只是没有开始。我想我只是不太了解这里的生命周期,但也许有人可以帮助我指明正确的方向?

目前 konva@7.0.3 不支持 Sprite 对象的 caching/filters。

作为解决方法,您可以:

  1. 使用 sprite 图像创建 Konva.Image 实例并对其使用滤镜。
  2. 使用 node.toImage() 方法将 Konva.Image 实例转换为原生图像元素。因此,您将拥有 sprite 图像,但应用了滤镜
  3. 为动画精灵使用生成的原生图像