绘制动画

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

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

图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宝典》,欢迎在线阅读,并提出宝贵意见。

HTML5 绘制动画相关推荐

  1. HTML5 Canvas动画效果实现原理

    在线演示 使用HTML5画布能够帮助我们快速实现简单的动画效果,基本原理如下: 每隔一定时间绘制图形并且清除图形,用来模拟出一个动画过程,可以使用context.clearRect(0, 0, x, ...

  2. html动画的 原理,HTML5 Canvas动画效果实现原理

    在线演示 使用html5画布能够帮助我们快速实现简单的动画效果,基本原理如下: 每隔一定时间绘制图形并且清除图形,用来模拟出一个动画过程,可以使用context.clearrect(0, 0, x, ...

  3. html5时钟代码菜鸟课程,html5绘制时钟动画

    这篇文章主要介绍了html5绘制时钟动画,需要的朋友可以参考下 复制代码代码如下: var clock=document.getElementById("clock"); var ...

  4. html5 白云,html5绘制一朵逼真的白云动画特效

    html5绘制一朵逼真的白云动画特效,蓝蓝的天空中一朵白色模糊云朵飘动着. 查看演示 下载资源: 11 次 下载资源 下载积分: 10 积分 js代码 var Cloud = {}; Cloud.in ...

  5. android 三维动画效果,9款令人惊叹的HTML5 3D动画应用

    原标题:9款令人惊叹的HTML5 3D动画应用 之前我们已经向大家分享了很多HTML5动画应用了,大部分都非常炫酷,也有一小部分是很实用的.今天我们要向各位HTML5动画爱好者介绍更多的HTML5 3 ...

  6. 惊艳的HTML5粒子动画特效

    转自:http://geek.csdn.net/news/detail/201487?ref=myread HTML5确实非常强大,很多时候我们可以利用HTML5中的新技术实现非常炫酷的粒子动画效果, ...

  7. Android中使用SurfaceView和Canvas来绘制动画

    事实上每一个View中都有Canvas能够用来绘制动画.仅仅须要在这个View中重载onDraw()方法就能够,可是SurfaceView类是一个专门用来制动动画的类. Canvas(中文叫做&quo ...

  8. html简单的文字自动出现效果,8个华丽的HTML5文字动画特效赏析

    文字是网页的灵魂,很早以前有人发明了很多漂亮的计算机字体,这让网页变得样式各异.HTML5和CSS3的出现,我们可以让文字变得更加富有个性,在一些需要的场合,我们甚至可以利用HTML5制作文字动画.本 ...

  9. ae制h5文字动画_对于8个华丽的HTML5文字动画特效图文赏析

    文字是网页的灵魂,很早以前有人发明了很多漂亮的计算机字体,这让网页变得样式各异.HTML5和CSS3的出现,我们可以让文字变得更加富有个性,在一些需要的场合,我们甚至可以利用HTML5制作文字动画.本 ...

最新文章

  1. 低代码缺少的五大组件
  2. python的特点和优点-【Python面试】 Python 的特点和优点是什么?
  3. 与IO相关的等待事件troubleshooting-系列9
  4. c 调用python_c调用python
  5. 进一步:BSD信号和异常同时捕获
  6. Linux-MySQL基本命令-SQL语句
  7. 基于ansj_seg和nlp-lang的简单nlp工具类
  8. c语言10个裁判,5个裁判可以对10个歌手进行打分,计算各个歌手的最终得分排列...
  9. Vue.js 条件与循环
  10. python的变量名可以是中文吗_Python中用中文变量名、函数名,会影响性能吗?
  11. C语言中#define的用法
  12. 最近流行的PlanB,全民副业的时代开启了?
  13. 第十三届中国生物特征识别大会(CCBR2018)征文通知
  14. Mac下编程的实用快捷键
  15. 卫星定位原理以及室内定位技术
  16. 浅谈二叉搜索树(BST)
  17. 小米电视4a系统android,小米电视4A请别糟蹋“人工智能”这几个字!
  18. 食物链(Food Chain POJ 1182)
  19. unity3d terrian tree 地形组件 草木石树无法碰撞的解决办法
  20. Spring boot 配置健康检查

热门文章

  1. Linux时间同步(内外网/内网/外网)
  2. 物联网模式下的污水处理前景分析
  3. 分类算法----逻辑回归预测
  4. Httpclient处理摘要认证
  5. Webscalesql代码浏览记录
  6. Java 信号 Semaphore 简介
  7. 如何解决ArrayAdapter requires the resource ID to be a TextView
  8. Jinja2学习笔记暨官方文档的翻译 -- 转载
  9. HDOJ 2955 Robberies (01背包)
  10. 利用INF安装服务启动 及 浅析瑞星行为检测、360主动防御