将跑步者添加到时间线的动画



我希望有由按钮控制的动画。我的想法是有一些时间表,我可以播放(),例如当点击正确的按钮时。

我是这个库的新手,对动画系统感到困惑。

[此代码刻意冗长,不是svs.js编码风格]

var myRect = canvas.rect(30,30);
myRect.fill('blue');
myRect.attr({x: '-15', y: '-15'});
var myRectRunner1 =  myRect.animate(2000).ease('-').attr({x: '25', y: '-15'});
var myTimeline1 = new SVG.Timeline();
myTimeline1.persist(true); // otherwise runners are deleted after running
myTimeline1.schedule(myRectRunner1, 0, 'last');  // I will add other runners too
myTimeline1.time(0); // docs don't say if this is needed; be safe

这实际上是有效的,当点击事件触发时使用myTimeline1.play()

但我认为实验中发生的事情是,当我创建myRectRunner1时,会创建一个新的时间线,并立即播放;然后,当我将runner添加到myTimeline时,旧的时间线将停止或重置,并且runner将绑定到myTimeline,并等待播放指令。

这是正确的吗?

什么是进行的好方法?

var myRectRunner1 = myRect.animate(2000).ease('-').attr({x: '25', y: '-15'}).active(false);

并在将转轮加载到myTimeline上后使其处于活动状态?这行得通,但有点乱。

我可以创建一个新的runner[var runner = new SVG.Runner(2000)],将其添加到myTimeline中,然后在它出现在时间线上后指定目标attr()——这又有点混乱,因为它将持续时间与动画规范的其余部分分开。

但我怀疑有一个好方法我还没有发现。

=======

一般问题:

  • 如果我减少跑步者在时间线上的持续时间,会发生什么?下面的运行程序是否仍然立即执行(即时间线存储运行程序序列),或者时间线只是存储执行时间,因此会有间隙
  • 我认为(从视觉上)默认宽松是"<gt;',如果没有具体说明宽松政策,这是正确的吗
  • 时间线结束时,如何激发事件?我目前正在添加一个持续时间为零的最后一个虚拟跑步者:myDummyRunner.after(myfunction),但可能有一些方法,比如myTimeline.after(myfunction)
  • 如果我在myTimeline结束时触发一个事件,并在事件处理程序中指定myTimeline.reverse(),那么在动画开始向后运行之前会有大约一秒钟的延迟——这种延迟是故意的还是不可避免的,还是我不明白
  • 我真的可以有多个时间表吗?只要我对冲突负责,我可以把同一个跑步者添加到不同的时间表中吗?在这种情况下,myRect.timeline()返回什么?(在SVG.Timeline文档中用作示例的元素的未记录方法)。myRectRunner1.timeline()究竟返回了什么

感谢您提供的任何帮助/见解-我很确定我对此理解不够好,一旦我理解了,答案就会变得显而易见。

好吧,如果它能帮助其他人:

库代码是由优秀的程序员编写的——代码看起来结构优美、干净且非常高效

文档是由优秀的程序员编写的,但天哪,你需要一个擅长文档的人,他会让文档保持最新。这里有两件大事:

  1. 文档声称该库将与IE9配合使用,这是不真实的;根据犬科动物的说法,这对至少7%的赌客来说是行不通的。据推测,代码已经更改,但文档没有更改。这样误导人们是不好的
  2. 如果你需要的不仅仅是基础知识,你就必须阅读代码——这使得库的使用成本非常高

试图回答我自己的问题:

如果我减少跑步者在时间线上的持续时间,会发生什么?下面的运行程序是否仍然立即执行(即时间线存储运行程序序列),或者时间线只是存储执行时间,因此会有间隙?

当一个跑步者被安排到一个时间线上时,它会得到一个相对于时间线开始的执行时间。跑步者不是按顺序存储的——他们在到达时间时跑步。不可能更改持续时间,但您可以取消对跑步者的安排,然后用新的持续时间重新安排。你可能必须访问它本来应该运行的时间并设置它——如果你用when="absolute"来安排,那么延迟参数现在会设置运行程序的时间,尽管文档没有告诉你。另一个未记录的功能是when='withlast',当之前添加的跑步者开始移动时,即在上一个跑步者上的任何延迟之后,它会启动跑步者(从任何延迟开始)。这与when='last'不同,后者在时间线上使用的最新点开始跑步者,而不是在之前添加的跑步者的末尾。

我认为(视觉上)默认的宽松政策是'<gt;',如果没有具体说明宽松政策,这是正确的吗?

不,看起来像,但代码上写着">">

当时间线结束时,如何激发事件?我目前正在添加最后一个持续时间为零的虚拟跑步者:myDummyRunner.after(myfunction),但可能有一些方法,比如myTimeline.fafter(myfunction)

myTimeline.on('finished',myFunction)

Timeline相当安静——并不是为我想要的东西而设计的。我添加了大量的虚拟跑步者,因为我需要知道我在时间表上的位置。一个主要的障碍是,即使跑步者可以告诉你他们什么时候开始("开始"事件)和什么时候结束(.after()),当你把时间线向后跑时,这两个都不会启动;我最终在一个虚拟跑步者中赶上了"step"事件(.during())。Yuk.

如果我在myTimeline结束时触发事件,并在事件处理程序中指定myTimeline.reverse(),那么在动画开始向后运行之前会有大约一秒钟的延迟-这种延迟是故意的还是不可避免的,还是我不明白?

现在这种情况不会发生在我身上。

我真的可以有多个时间线吗?只要我对冲突负责,我可以把同一个跑步者添加到不同的时间表中吗?在这种情况下,myRect.timeline()会返回什么?(在SVG.Timeline文档中用作示例的元素的未记录方法)。实际上,myRectRunner1.timeline()返回的是什么?

是,有多个时间线。我想跑步者只会用一次,但不确定。myRect.timeline()只是返回您之前设置的时间线-存储在myRect中的时间线仅在您.animate()指定跑步者所在的时间线时使用-它对myRect没有任何其他作用,根本不将其绑定到时间线。

===

我希望这能帮助其他人

最新更新