HTML5用canvas怎么实现动画效果

如题所述

HTML5用canvas实现动画效果举例:

1、定义动画按钮

<div id="controls">

<input id="animateButton" type="button" value="动画开始">

</div>

2、定义页面的canvas布局

<canvas id="canvas" width="750" height="500">

</canvas>

3、通过js脚本来控制动画:

var canvas = document.getElementById('canvas'),

context = canvas.getContext('2d'),

paused = true,

discs = [

x: 150,

y: 250,

lastX: 150,

lastY: 250,

velocityX: -3.2,

velocityY: 3.5,

radius: 25,

innerColor: 'rgba(255,255,0,1)',

middleColor: 'rgba(255,255,0,0.7)',

outerColor: 'rgba(255,255,0,0.5)',

strokeStyle: 'gray',

},


x: 50,

y: 150,

lastX: 50,

lastY: 150,

velocityX: 2.2,

velocityY: 2.5,

radius: 25,

innerColor: 'rgba(100,145,230,1.0)',

middleColor: 'rgba(100,145,230,0.7)',

outerColor: 'rgba(100,145,230,0.5)',

strokeStyle: 'blue'

},


x: 150,

y: 75,

lastX: 150,

lastY: 75,

velocityX: 1.2,

velocityY: 1.5,

radius: 25,

innerColor: 'rgba(255,0,0,1.0)',

middleColor: 'rgba(255,0,0,0.7)',

outerColor: 'rgba(255,0,0,0.5)',

strokeStyle: 'orange'

},

],

numDiscs = discs.length,

animateButton = document.getElementById('animateButton');


// Functions.....................................................


function drawBackground() {

var STEP_Y = 12,

i = context.canvas.height;

context.strokeStyle = 'lightgray';

context.lineWidth = 0.5;


while(i > STEP_Y*4) {

context.beginPath();

context.moveTo(0, i);

context.lineTo(context.canvas.width, i);

context.stroke();

i -= STEP_Y;

}


context.save();


context.strokeStyle = 'rgba(100,0,0,0.3)';

context.lineWidth = 1;


context.beginPath();


context.moveTo(35,0);

context.lineTo(35,context.canvas.height);

context.stroke();


context.restore();

}


function update() {

var disc = null;


for(var i=0; i < numDiscs; ++i) {

disc = discs[i];


if (disc.x + disc.velocityX + disc.radius > context.canvas.width ||

disc.x + disc.velocityX - disc.radius < 0) 

disc.velocityX = -disc.velocityX;


if (disc.y + disc.velocityY + disc.radius > context.canvas.height ||

disc.y + disc.velocityY - disc.radius  < 0) 

disc.velocityY= -disc.velocityY;


disc.x += disc.velocityX;

disc.y += disc.velocityY;

}

}

//动画开始

function draw() {

var disc = discs[i];


for(var i=0; i < numDiscs; ++i) {

disc = discs[i];


gradient = context.createRadialGradient(disc.x, disc.y, 0,

disc.x, disc.y, disc.radius);


gradient.addColorStop(0.3, disc.innerColor);

gradient.addColorStop(0.5, disc.middleColor);

gradient.addColorStop(1.0, disc.outerColor);


context.save();

context.beginPath();

context.arc(disc.x, disc.y, disc.radius, 0, Math.PI*2, false);

context.fillStyle = gradient;

context.strokeStyle = disc.strokeStyle;

context.fill();

context.stroke();

context.restore();

}

}


// 动画开始,执行绘制背景drawBackground,更新切换update,画笔绘制draw三个步骤


function animate(time) {

if (!paused) {

context.clearRect(0,0,canvas.width,canvas.height);

drawBackground();

update();

draw();


window.requestNextAnimationFrame(animate);

}

}

//初始化开始


context.font = '48px Helvetica'; //定义字体


//开始动画点击事件

animateButton.onclick = function (e) {

paused = paused ? false : true;

if (paused) { //如果是停止状态,把文本且化成开始动画

animateButton.value = 'Animate';

}

else { //否则如果是运动状态,把文本且化成停止动画

window.requestNextAnimationFrame(animate);

animateButton.value = 'Pause';

}

};

4、运行效果:

温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-07-21
使用HTML5画布能够帮助我们快速实现简单的动画效果,基本原理如下:
首先是绘制图形的方法,如下:
function myAnimation() {
ctx.clearRect(0, 0, canvas_size_x, canvas_size_y);

if (x_icon < 0 || x_icon > canvas_size_x - size_x) {
stepX = -stepX;
}

if (y_icon < 0 || y_icon > canvas_size_y - size_y) {
stepY = -stepY;
}

x_icon += stepX;
y_icon += stepY;

ctx.drawImage(anim_img, x_icon, y_icon);
}

以上方法每隔一定时间清除画布内容,并且重新计算绘制图形位置,一旦超过了画布大小,则反转坐标绘制图形。
下面是实际绘制图形方法:
function draw() {
var canvas = document.getElementById("canvas");
ctx = canvas.getContext("2d");

anim_img = new Image(size_x, size_y);

anim_img.onload = function() {
setInterval('myAnimation()', 5);
}

anim_img.src = 'http://www./.com/gb/networks/avatars/80x8013d6393f-a44c-4180-8cb6-7bf0e4776283.png';
}

以上方法将图形定义,并且调用实际绘制动画的方法,搞定!
如果大家对于HTML5绘制动画有兴趣,或者希望了解如何模拟物理动画效果,请阅读下面的互动教程,相信能够帮助你更好理解HTML画布:
第2个回答  2016-07-21
写个函数,不断绘图。。。
相似回答