【问题标题】:How do you pause a looped animation in SVG.js?如何在 SVG.js 中暂停循环动画?
【发布时间】:2018-06-06 18:29:18
【问题描述】:

我有一个看起来像这样的循环动画:

foreground.animate(1000, '>').stroke({ opacity: 0, width: 34 }).loop();

我想在每个循环中加入 800 毫秒的延迟。特别是在每次笔画动画到{ opacity: 0, width: 34 }之前。我尝试在动画中添加延迟:

foreground.animate(1000, '>', 800).stroke({ opacity: 0, width: 34 }).loop();

……但这只是延迟了第一个循环。然后我尝试添加delay()

foreground.animate(1000, '>').stroke({ opacity: 0, width: 34 }).delay(800).loop();

……但那也只会增加一次延迟。

是否可以让每个循环在每个循环开始时包含 800 毫秒的延迟?

【问题讨论】:

  • 我已经找到了使用setInterval 以及使用.after() 进行递归的其他SVG.js 动画的解决方案,例如this example。但是当我将解决方案应用于您的动画时,它只会触发一次。所以我认为这与动画属性有关。

标签: animation svg svg.js


【解决方案1】:

如果我理解正确,实现此目的的一种方法是将与动画相关的代码放在一个函数中,并在每个动画结束时调用该函数:

function cycle() {
  this.stroke({width: 0, opacity: 1}) 
      .animate(1000, '>', 800)
      .stroke({opacity:0, width: 34})
      .after(cycle);
}

然后我们可以使用cycle.apply(foreground)this 成为被转换的元素并开始动画:

var draw = SVG('content').size(500, 300)
var circle = draw.circle(100).attr({ fill: 'steelblue' }).move(200,20)

cycle.apply(circle);

function cycle() {
  this.stroke({width: 0, opacity: 1})
      .animate(1000, '>', 800)
      .stroke({opacity:0, width: 34})
      .after(cycle);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/svg.js/2.6.5/svg.js"></script>

<div id="content"></div>

【讨论】:

  • 对于 svg.js v2,这是正确的解决方案。在 v3 中将有更简单的方法来实现这一目标
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-23
  • 2017-09-09
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
  • 2020-04-15
  • 1970-01-01
相关资源
最近更新 更多