摘要:每周一点动画是一个系列文章,本文并不对的做过多的介绍,我默认你已经了解基本的绘图,并在此告诉你如何使用简单的数学与物理知识创建相当酷炫的动画。下一节,我们就正式开始我们的动画之旅
《每周一点canvas动画》是一个系列文章,本文并不对canvas的API做过多的介绍,我默认你已经了解基本的canvas绘图API,并在此告诉你如何使用简单的数学与物理知识创建相当酷炫的动画。一说到物理和数学知识各位骚年们是不是感觉蛋疼(原谅我说脏话了),不过我要告诉你,我们用到的数学和物理知识真的很简单,一点都不可怕。
1.支持情况canvas作为H5中最为重要的新增特性,使开发者可以用它来创作各种令人惊叹的作品。但开发者最关心的问题肯定是浏览器的支持情况(图片来自张鑫旭博客)!
2.本文主要内容本系列文章主要介绍Canvas 2D动画原理,以及简单的如何在2D平面模仿3D效果的方法,中间可能会穿插一些与其他技术相结合的DEMO和项目。首先,我们创作动画的基本文档结构如下。
canvas动画序
在此我们需要明白动画的基本概念:
动画其实是由不同的静态画面组成,每一幅静态画面我们叫做一帧(frame),当众多的静态画面按照一定的规则快速运动时,我们的眼睛就会欺骗我们的大脑,从而形成物体运动的假象。在这里先给大家展示用Canvas创作的两个酷炫动画,看看它是否够简洁,够酷炫!
第一个动画是一个用Canvas做的百分比加载动画(根据读者的建议,已经对错误的代码做了修改)。codePen地址
var canvas = document.getElementById("canvas"), //获取canvas元素 context = canvas.getContext("2d"), //获取画图环境,指明为2d centerX = canvas.width/2, //Canvas中心点x轴坐标 centerY = canvas.height/2, //Canvas中心点y轴坐标 rad = Math.PI*2/100, //将360度分成100份,那么每一份就是rad度 speed = 0.1; //加载的快慢就靠它了 //绘制蓝色外圈 function blueCircle(n){ context.save(); context.beginPath(); context.strokeStyle = "#49f"; context.lineWidth = 12; context.arc(centerX, centerY, 100 , -Math.PI/2, -Math.PI/2 + n*rad, false); context.stroke(); context.restore(); } //绘制白色外圈 function whiteCircle(){ context.save(); context.beginPath(); context.strokeStyle = "#A5DEF1"; context.lineWidth = 12; context.arc(centerX, centerY, 100 , 0, Math.PI*2, false); context.stroke(); context.closePath(); context.restore(); } //百分比文字绘制 function text(n){ context.save(); context.fillStyle = "#F47C7C"; context.font = "40px Arial"; context.textAlign = "center"; context.textBaseline = "middle"; context.fillText(n.toFixed(0)+"%", centerX, centerY); context.restore(); } //动画循环 (function drawFrame(){ window.requestAnimationFrame(drawFrame, canvas); context.clearRect(0, 0, canvas.width, canvas.height); whiteCircle(); text(speed); blueCircle(speed); if(speed > 100) speed = 0; speed += 0.1; }());