我创建了一些在画布上相互连接的线条。现在我想在画布上画画时为这些线设置动画。
有人可以帮忙吗?
这是我的代码和小提琴网址:
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
ctx.moveTo(0,0,0,0);
ctx.lineTo(300,100);
ctx.stroke();
ctx.moveTo(0,0,0,0);
ctx.lineTo(10,100);
ctx.stroke();
ctx.moveTo(10,100,0,0);
ctx.lineTo(80,200);
ctx.stroke();
ctx.moveTo(80,200,0,0);
ctx.lineTo(300,100);
ctx.stroke();
答案 0 :(得分:21)
我知道您希望线条使用动画沿着路径中的点逐渐延伸。
演示:http://jsfiddle.net/m1erickson/7faRQ/
您可以使用此功能计算路径上的航点:
// define the path to plot
var vertices=[];
vertices.push({x:0,y:0});
vertices.push({x:300,y:100});
vertices.push({x:80,y:200});
vertices.push({x:10,y:100});
vertices.push({x:0,y:0});
// calc waypoints traveling along vertices
function calcWaypoints(vertices){
var waypoints=[];
for(var i=1;i<vertices.length;i++){
var pt0=vertices[i-1];
var pt1=vertices[i];
var dx=pt1.x-pt0.x;
var dy=pt1.y-pt0.y;
for(var j=0;j<100;j++){
var x=pt0.x+dx*j/100;
var y=pt0.y+dy*j/100;
waypoints.push({x:x,y:y});
}
}
return(waypoints);
}
然后,您可以使用requestAnimationFrame为每个增量线段设置动画:
// calculate incremental points along the path
var points=calcWaypoints(vertices);
// variable to hold how many frames have elapsed in the animation
// t represents each waypoint along the path and is incremented in the animation loop
var t=1;
// start the animation
animate();
// incrementally draw additional line segments along the path
function animate(){
if(t<points.length-1){ requestAnimationFrame(animate); }
// draw a line segment from the last waypoint
// to the current waypoint
ctx.beginPath();
ctx.moveTo(points[t-1].x,points[t-1].y);
ctx.lineTo(points[t].x,points[t].y);
ctx.stroke();
// increment "t" to get the next waypoint
t++;
}
答案 1 :(得分:3)
jsfiddle:http://jsfiddle.net/Grimbode/TCmrg/
以下是两个帮助我了解动画效果的网站。
http://www.williammalone.com/articles/create-html5-canvas-javascript-sprite-animation/
在这篇文章中,威廉讲精灵动画,当然这不是你感兴趣的。有趣的是他使用了Paul Irish创建的递归循环函数。
http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/
此功能将尝试每秒旋转60次(因此基本上以60 fps为单位)。
(function() {
var lastTime = 0;
var vendors = ['webkit', 'moz'];
for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
window.cancelAnimationFrame =
window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame'];
}
if (!window.requestAnimationFrame)
window.requestAnimationFrame = function(callback, element) {
var currTime = new Date().getTime();
var timeToCall = Math.max(0, 16 - (currTime - lastTime));
var id = window.setTimeout(function() { callback(currTime + timeToCall); },
timeToCall);
lastTime = currTime + timeToCall;
return id;
};
if (!window.cancelAnimationFrame)
window.cancelAnimationFrame = function(id) {
clearTimeout(id);
};
}());
所以最重要的问题是,这是如何运作的?你几乎只需要这样做:
function gameLoop () {
window.requestAnimationFrame(gameLoop);
renderLine();
}
var counter = 0;
var old_position = {x: 0, y: 0};
var new_position = {x: 0, y: 0};
var width = 10;
var height = 10;
function renderLine(){
/* Here you clear the old line before you draw the new one */
context.clearRect(old_position.x, old_position.y, width, height)
/* you update your new position */
new_position = {x: 100, y: 200};
/* Here you call your normal moveTo and lineTo and stroke functions */
/* update old position with the nwe position */
old_position = new_position;
}
在此步骤之后,您的问题可能会像。 &#34;好吧,我有一些动画,但我不希望我的直线动画以60 fps&#34;旋转。如果您阅读威廉姆斯帖子,他会使用&#34; ticks&#34;。
我联系的网站在解释方面做得比我做得好得多。我建议你阅读它们。 [=我很开心读它们。
AND:这是你的jfiddle:)
答案 2 :(得分:0)
这个想法是在一个循环中绘制和绘制并绘制几条不同的线条,以产生幻觉,即动画&#34; 。但无论如何,这就是动画的概念。
因此,确定您想要做什么动画,并找出一种可以在循环中绘制每个帧的方法。
无论如何,这个概念。但我建议您使用库。
Fabric.js(http://fabricjs.com/)和KineticJS(http://kineticjs.com/)是我指向的图书馆/框架。