HTML5 绘制动画

绘制动画

虽然canvas的API并未直接提供支持动画的方法,但就其本身而言,在canvas中实现动画效果也很简单:只需要持续的更新并重绘画布就行了。这种持续的更新并重绘就叫做动画循环,它是所有动画的核心逻辑。

在canvas中实现动画,首先需要初始化画布上的对象。然后,启动一个动画循环来更新画布、清除画布、重绘画布,再请求下一个新的动画帧。Canvas动画的基本原理如图 4‑36 所示:

canvas动画的基本原理图4-36 canvas动画的基本原理

接下来通过一个简单实例,来看看canvas动画的实现过程。该实例以动画的方式,实现一个旋转的八卦图。代码如下:

 
 
  1. function clear() {  
  2.    context.clearRect(0, 0, canvas.width, canvas.height);
  3. }
  4. function rotate() {
  5.    context.rotate(Math.PI/30);  // 每分钟旋转一周
  6. }
  7. function draw () {
  8.     // 绘制白色半圆
  9.    context.beginPath();
  10.    context.arc(0, 0, 80, 1.5*Math.PI, Math.PI/2, false);
  11.    context.fillStyle = "white";
  12.    context.closePath();
  13.    context.fill();
  14.            
  15.    // 绘制黑色半圆
  16.    context.beginPath();
  17.    context.arc(0, 0, 80, Math.PI/2, 1.5*Math.PI, false);
  18.    context.fillStyle = "black";
  19.    context.closePath();
  20.    context.fill();
  21.            
  22.     // 绘制黑色小圆
  23.     context.beginPath();
  24.     context.arc(0, 40, 40, 0, Math.PI*2, true);
  25.     context.fillStyle = "black";
  26.     context.closePath();
  27.     context.fill();
  28.            
  29.     // 绘制白色小圆
  30.     context.beginPath();
  31.     context.arc(0, -40, 40, 0, Math.PI*2, true);
  32.     context.fillStyle = "white";
  33.     context.closePath();
  34.     context.fill();
  35.            
  36.     // 绘制白色小圆心
  37.     context.beginPath();
  38.     context.arc(0, -40, 5, 0, Math.PI*2, true);
  39.     context.fillStyle = "black";
  40.     context.closePath();
  41.     context.fill();
  42.            
  43.     // 绘制黑色小圆心
  44.     context.beginPath();
  45.     context.arc(0, 40, 5, 0, Math.PI*2, true);
  46.     context.fillStyle = "white";
  47.     context.closePath();
  48.     context.fill();
  49. }
  50. function drawStage() {
  51.      rotate();  // 更新
  52.      clear();   // 清除
  53.      draw();    // 重绘
  54. }
  55. window.onload = function(){
  56.     canvas = document.getElementById('canvas');
  57.     context = canvas.getContext('2d');
  58.           
  59.     context.translate(canvas.width/2, canvas.height/2);
  60.           
  61.     setInterval(drawStage, 100);
  62. };

上述代码,当页面加载完成后,首先进行初始化,然后调用setInterval(drawStage, 100)方法启动动画循环,在动画循环中,每隔100ms会调用一次drawStage ()函数,来执行更新画布、清除画布、重绘画布的操作,以实现动画效果。运行结果如图 4‑37 所示:

旋转的八卦图图4-37 旋转的八卦图

当然,这里只是为了演示实现动画的原理而已,所以实例相对简单。其实,Canvas中的动画可以很简单,也可以很复杂。不管简单还是复杂,其基本原理是完全相同的。

关于作者

歪脖先生,十五年以上软件开发经验,酷爱Web开发,精通 HTML、CSS、JavaScript、jQuery、JSON、Python、Less、Bootstrap等,著有《HTML宝典》、《揭秘CSS》、《Less简明教程》、《JSON教程》、《Bootstrap2用户指南》,并全部在 GitHub 上开源。

版权声明:本文出自 歪脖网 的《HTML宝典》,欢迎在线阅读,并提出宝贵意见。

猜你喜欢

转载自blog.csdn.net/ixygj197875/article/details/80086551