为什么 html canvas 线条动画可以工作,但在已经画了一条线之后就不行了
Why does html canvas line animation work but not after already drawing a line
我可以一点一点地画线,但是如果我先把线画完整,然后再画点,所有的点一下子就出来了。
所以请看代码,在 window_onload 函数中,如果我改为调用 pathAll 而不是 startRedDots,您就会明白我的意思。它会画线,然后所有的红点同时出现,不知道为什么。
<script type="text/javascript">
var pauseAmount = 300;
var m1, c1;
var pathInt;
var points1 = [new Vector(10, 10),new Vector(500, 500)];
function Vector(x, y)
{
this.X = x;
this.Y = y;
}
var counter;
var startX;
var startY;
var endX;
var endY;
var amount;
function resetVars() {
counter=0;
startX = points1[counter].X;
startY = points1[counter].Y;
endX = points1[counter+1].X;
endY = points1[counter+1].Y;
amount = 0;
c1.strokeStyle = "lightgrey";
c1.lineWidth = 15;
c1.lineCap = "round";
c1.setLineDash([1, 30]);
}
window.onload = function()
{
m1 = document.querySelector("#b");
c1 = m1.getContext("2d");
resetVars();
//pathInt = setTimeout(function(){ pathAll(); }, 1);
pathInt = setInterval(function(){ startRedDots(); }, pauseAmount);
};
function pathAll() {
c1.moveTo(startX, startY);
c1.lineTo(endX, endY);
c1.stroke();
resetVars();
setTimeout(function(){ startRedDots(); }, 2500);
}
function startRedDots() {
c1.strokeStyle = "red";;
pathInt = setInterval(function(){ oneAtATime(); }, pauseAmount);
}
function oneAtATime() {
c1.moveTo(startX, startY);
c1.lineTo(startX + (endX - startX) * amount, startY + (endY - startY) * amount);
//alert(startX + (endX - startX) * amount);
if (points1[counter+1].X < points1[counter].X) {
if(points1[counter+1].X < Math.round(eval(startX + (endX - startX) * amount))) {
c1.stroke();
}
else {
clearInterval(pathInt);
}
}
else if (points1[counter+1].X > points1[counter].X) {
if(points1[counter+1].X > Math.round(eval(startX + (endX - startX) * amount))) {
//alert(startX + (endX - startX) * amount);
c1.stroke();
}
else {
clearInterval(pathInt);
}
}
else if (points1[counter+1].X == points1[counter].X) {
if(points1[counter+1].X == Math.round(eval(startX + (endX - startX) * amount))) {
c1.stroke();
}
else {
clearInterval(pathInt);
}
}
amount += 0.01;
}
</script>
<canvas id="b" width="600" height="600" style="position:absolute;top:50px;left:50px;"></canvas>
好的,如果有人感兴趣的话,我已经可以使用了...只需要在 oneAtATime 函数中添加 'c1.beginPath();' 作为第一行。
我可以一点一点地画线,但是如果我先把线画完整,然后再画点,所有的点一下子就出来了。
所以请看代码,在 window_onload 函数中,如果我改为调用 pathAll 而不是 startRedDots,您就会明白我的意思。它会画线,然后所有的红点同时出现,不知道为什么。
<script type="text/javascript">
var pauseAmount = 300;
var m1, c1;
var pathInt;
var points1 = [new Vector(10, 10),new Vector(500, 500)];
function Vector(x, y)
{
this.X = x;
this.Y = y;
}
var counter;
var startX;
var startY;
var endX;
var endY;
var amount;
function resetVars() {
counter=0;
startX = points1[counter].X;
startY = points1[counter].Y;
endX = points1[counter+1].X;
endY = points1[counter+1].Y;
amount = 0;
c1.strokeStyle = "lightgrey";
c1.lineWidth = 15;
c1.lineCap = "round";
c1.setLineDash([1, 30]);
}
window.onload = function()
{
m1 = document.querySelector("#b");
c1 = m1.getContext("2d");
resetVars();
//pathInt = setTimeout(function(){ pathAll(); }, 1);
pathInt = setInterval(function(){ startRedDots(); }, pauseAmount);
};
function pathAll() {
c1.moveTo(startX, startY);
c1.lineTo(endX, endY);
c1.stroke();
resetVars();
setTimeout(function(){ startRedDots(); }, 2500);
}
function startRedDots() {
c1.strokeStyle = "red";;
pathInt = setInterval(function(){ oneAtATime(); }, pauseAmount);
}
function oneAtATime() {
c1.moveTo(startX, startY);
c1.lineTo(startX + (endX - startX) * amount, startY + (endY - startY) * amount);
//alert(startX + (endX - startX) * amount);
if (points1[counter+1].X < points1[counter].X) {
if(points1[counter+1].X < Math.round(eval(startX + (endX - startX) * amount))) {
c1.stroke();
}
else {
clearInterval(pathInt);
}
}
else if (points1[counter+1].X > points1[counter].X) {
if(points1[counter+1].X > Math.round(eval(startX + (endX - startX) * amount))) {
//alert(startX + (endX - startX) * amount);
c1.stroke();
}
else {
clearInterval(pathInt);
}
}
else if (points1[counter+1].X == points1[counter].X) {
if(points1[counter+1].X == Math.round(eval(startX + (endX - startX) * amount))) {
c1.stroke();
}
else {
clearInterval(pathInt);
}
}
amount += 0.01;
}
</script>
<canvas id="b" width="600" height="600" style="position:absolute;top:50px;left:50px;"></canvas>
好的,如果有人感兴趣的话,我已经可以使用了...只需要在 oneAtATime 函数中添加 'c1.beginPath();' 作为第一行。