是啥导致我的动画在第一次播放后失败?

Posted

技术标签:

【中文标题】是啥导致我的动画在第一次播放后失败?【英文标题】:What is causing my animation to fail on plays after the first?是什么导致我的动画在第一次播放后失败? 【发布时间】:2021-06-06 00:03:58 【问题描述】:

我的目标是从 Angular Material 组件库中重新实现 mat-tab。

使用LR 按钮,我正在播放调整按钮集合上left 样式的动画。我遇到的问题是每个动画只能播放一次。例如,我可以遍历位置right from 0 to 1,然后遍历left from 1 to 0 - 但如果我尝试再次遍历right from 0 to 1,则不会发生任何事情。所有动画都可以在数组中引用,并且在创建后不会被更改 - 那么为什么当我重用它们时行为会发生变化?

StackBlitz

【问题讨论】:

请在您的问题中直接放一个最小的可重现示例,请参阅 [link]***.com/help/minimal-reproducible-example 【参考方案1】:

不幸的是,由于我还没有过多使用 Angulars 动画,因此我无法提出一个可行的解决方案,但是对于您的问题:动画正在使用状态来处理转换,并且在您提供的示例中,每个动画都只能工作每次播放后都会进入完成状态。

我尝试过,但它只是部分工作,是在移动到另一个方向时重置动画。这适用于位置 0 => 1 和 1 => 0,但如果你移动到位置 2,你只能回到位置 1 而不是 0 - 不知道为什么。

public slideLeft(): void 
  console.log(`sliding from $this.position to $this.position - 1`);
  if (this.position > 0) 
    console.log(`playing left animation at $this.position`);
    let animation = this.leftAnimations[this.position];
    animation.play();
    this.position -= 1;

    // in slideRight use leftAnimations
    this.rightAnimations.forEach(a => a.reset());

    /* also tried it like that
    const pos = this.position;
    animation.onDone(() => 
      console.log(`resetting right animation at $pos`);
      this.rightAnimations[pos].reset();
    );
    */

也许更好的解决方案是为每个步骤定义一个状态,并为每个步骤定义一个转换,这样您就可以使用一个变量来定义您的动画所处的状态。您需要找到一种方法,如何以编程方式将变量绑定到动画状态,这通常由 [@animationName]="variable" 完成。

【讨论】:

感谢您试一试。我仍在调查此问题,并在解决后发布我的发现。

以上是关于是啥导致我的动画在第一次播放后失败?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter - 我的动画只播放一次

安卓x5内核加载失败怎么办 导致失败的原因是啥呢

Unity Animator只播放一次

Action Script 3. 如何播放一次动画?

控制人物转向移动,动画播放的过程中插播其他动画后返回

unity 我的动画总是只播放第一帧无限卡