2014-11-24 111 views
3

我不明白为什么API包括cancelAnimationFrame(),因为 我可以通过设置变量continue这样停止动画:为什么我会永远需要cancelAnimationFrame()

function draw(timestamp) { 
    if (continue == true) { requestAnimationFrame(draw); } 
} 

所以问题是在什么情况下我应该使用cancelAnimationFrame()?

+0

api背后的概念是将意图传达给设备。我怀疑它是在这些方面。 – 2014-11-24 15:35:23

+3

您的代码演示如何有条件地计划下一个动画帧,但不演示如何取消先前预定的动画回调。可能会出现一些情况(例如,当用户触发另一个互斥的动画时),您可能希望在安排新动画之前取消未决的动画回调(类似于jQuery的'stop()'方法)。 – 2014-11-24 15:47:06

回答

0

首先,重要的参考点。 A(日)(候选推荐)规格:http://www.w3.org/TR/animation-timing/#definitions

关联与每一个文档是一个动画帧请求回调列表,其是元组的列表。句柄是一个整数^[long],用于唯一标识列表中的条目。回调是一个FrameRequestCallback对象。最初,Document的动画帧请求回调列表为空。

此外,让我们记住这些规范的目标受众是用户代理开发人员。在这些规范的实现中,用户代理为我们(应用程序开发人员)提供了一个API来与接口进行交互。

注意每个文件以上情绪;你可以有multible文件在window,或背景。你可以有多个上下文在浏览器上下文。

那么,如何,涉及到每个文档?好了,(建议)符合规范引用过程模型,基本上所有转储这些列表到一个空表,并执行回调对“保护”名单的结果调用算法 ..但同样,这是可能不是我们作为应用开发者的关注; *我认为,作为应用程序开发人员,我们不会在我们自己的window上下文的多个文档中跟踪和维护甚至是Document.FrameRequestList实例。我们只与API接口,可通过window访问。

现在,让我们总结一下requestAnimationFrame(<function>)确实有效,什么回报

调用​​并提供function作为回调,增加了一个条目<handler,FrameRequestCallback><long, "an object, with a cancelled member, that encapsulates your function">)成动画帧请求回调列表​​返回Handler [long]

根据上述规范(http://www.w3.org/TR/animation-timing/#dom-windowanimationtiming-cancelanimationframe

的cancelAnimationFrame方法用于取消先前请求作出安排一个动画帧更新。

人们可以推断,通过调用cancelAnimationFrame和作为参数供给(大概先前存储的)handle,你除去动画帧请求回调列表BUT该ISN的条目这种情况。

当cancelAnimationFrame(手柄)被调用时,用户代理必须被取消标志设置为true这个文件手柄注册的回调手柄取消标志设置回调是否在动画帧请求回调列表或不。如果没有给定句柄的回调,那么这个函数什么都不做。

因此,您在cancelAnimationFrame中提供的handle不会修改列表。它将取消标志设置为真'在回调'..这真的阻止它运行。这是合理的,因为上述(以上)处理模型


所以,你的问题(在问候你的问题的特定评论)跳过一个条目的动画帧请求回调列表文件的的增加,使用​​不保留现有的scheduled条目(或其取消标志为false的现有条目)不能运行。有一个“更大的”上下文和处理模型需要考虑(其中包括文档页面可见性属性)。

在你的问题中,有人提到你有可能想要取消计划框架请求 - 但更好的推理是针对无意的方面和考虑。

总之,如果您打算使用API​​请求进行回调的帧更新,请使用API​​取消/停止所述更新请求并停止回调。