Get to know MDN better
此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。
由于我们是用 JavaScript 去操控 <canvas> 对象,这样要实现一些交互动画也是相当容易的。在本章中,我们将看看如何做一些基本的动画。
可能最大的限制就是图像一旦绘制出来,它就是一直保持那样了。如果需要移动它,我们不得不对所有东西(包括之前的)进行重绘。重绘是相当费时的,而且性能很依赖于电脑的速度。
你可以通过以下的步骤来画出一帧:
在 canvas 上绘制内容是用 canvas 提供的或者自定义的方法,而通常,我们仅仅在脚本执行结束后才能看见结果,比如说,在 for 循环里面做完成动画是不太可能的。
因此,为了实现动画,我们需要一些可以定时执行重绘的方法。有两种方法可以实现这样的动画操控。首先可以通过 setInterval 和 setTimeout 方法来控制在设定的时间点上执行重绘。
首先,可以用 setInterval()、setTimeout() 和 requestAnimationFrame() 来设定定期执行一个指定函数。
setInterval()当设定好间隔时间后,function 会定期执行。
setTimeout()在设定好的时间之后执行函数
requestAnimationFrame()告诉浏览器你希望执行一个动画,并在重绘之前,请求浏览器执行一个特定的函数来更新动画。
如果你并不需要与用户互动,你可以使用 setInterval() 方法,它就可以定期执行指定代码。如果我们需要做一个游戏,我们可以使用键盘或者鼠标事件配合上 setTimeout() 方法来实现。通过设置事件监听,我们可以捕捉用户的交互,并执行相应的动作。
备注:下面的例子,采用 window.requestAnimationFrame()实现动画效果。这个方法提供了更加平缓并更加有效率的方式来执行动画,当系统准备好了重绘条件的时候,才调用绘制动画帧。一般每秒钟回调函数执行 60 次,也有可能会被降低。想要了解更多关于动画循环的信息,尤其是游戏,可以在Game development zone 参考这篇文章 Anatomy of a video game。
该示例展示了一个小型太阳系模型的动画。
该示例绘制一个可以显示当前时间的动画时钟。
备注:尽管时钟每秒只更新一次,但动画图像每秒更新 60 次(或者以你的 Web 浏览器的显示刷新率)。要使用扫描式的时钟,请将上面的 const sec 定义替换为已注释的版本。
在这个例子中,会有一个自左向右滑动的全景图。我们使用了在维基百科中找到的尤塞米提国家公园的图片,当然你可以随意找一张任何尺寸大于 canvas 的图片。
下方就是是图片在其中滑动的 <canvas>。需要注意的是这里定义的 width 和 height 必须与 JavaScript 代码中的变量值CanvasXZSize和CanvasYSize保持一致。
我们将在下一章看到一些先进的动画技术和物理现象。