我不明白为什么API包括cancelAnimationFrame()
,因为 我可以通过设置变量continue
这样停止动画:为什么我会永远需要cancelAnimationFrame()
function draw(timestamp) {
if (continue == true) { requestAnimationFrame(draw); }
}
所以问题是在什么情况下我应该使用cancelAnimationFrame()?
我不明白为什么API包括cancelAnimationFrame()
,因为 我可以通过设置变量continue
这样停止动画:为什么我会永远需要cancelAnimationFrame()
function draw(timestamp) {
if (continue == true) { requestAnimationFrame(draw); }
}
所以问题是在什么情况下我应该使用cancelAnimationFrame()?
首先,重要的参考点。 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取消/停止所述更新请求并停止回调。
api背后的概念是将意图传达给设备。我怀疑它是在这些方面。 – 2014-11-24 15:35:23
您的代码演示如何有条件地计划下一个动画帧,但不演示如何取消先前预定的动画回调。可能会出现一些情况(例如,当用户触发另一个互斥的动画时),您可能希望在安排新动画之前取消未决的动画回调(类似于jQuery的'stop()'方法)。 – 2014-11-24 15:47:06