你想要什麼是回調:
Circle(ctx, 50, 50, 25, 1000, function() { // animate drawing a circle
Circle(ctx, 150, 50, 25, 1000, function() { // then animate drawing a circle
Line(ctx, 75, 50, 125, 50, 1000, function(){ // then animate drawing a line
alert('done');
});
});
});
這裏有一個簡單的實現圓和線的動畫圖紙:
function Circle(context, x, y, radius, dur, callback) {
var start = new Date().getTime(),
end = start + dur,
cur = 0;
(function draw() {
var now = new Date().getTime(),
next = 2 * Math.PI * (now-start)/dur;
ctx.beginPath();
ctx.arc(x, y, radius, cur, next);
cur = Math.floor(next*100)/100; // helps to prevent gaps
ctx.stroke();
if (cur < 2 * Math.PI) requestAnimationFrame(draw); // use a shim where applicable
else if (typeof callback === "function") callback();
})();
}
function Line(context, x1, y1, x2, y2, dur, callback) {
var start = new Date().getTime(),
end = start + dur,
dis = Math.sqrt(Math.pow(x2-x1,2)+Math.pow(y2-y1,2)),
ang = Math.atan2(y2-y1, x2-x1),
cur = 0;
(function draw() {
var now = new Date().getTime(),
next = Math.min(dis * (now-start)/dur, dis);
ctx.beginPath();
ctx.moveTo(x1 + Math.cos(ang) * cur, y1 + Math.sin(ang) * cur);
ctx.lineTo(x1 + Math.cos(ang) * next, y1 + Math.sin(ang) * next);
cur = next;
ctx.closePath();
ctx.stroke();
if (cur < dis) requestAnimationFrame(draw); // use a shim where applicable.
else if (typeof callback === "function") callback();
})();
}
而這裏的工作(WebKit的只)演示:http://jsfiddle.net/QSAyw/3/
在完成第一個動作之後調用第二個'drawcircle'。你實際上已經在給出的僞代碼中有解決方案。 'if(finish drawing){'<<在這裏觸發* next *繪圖。 – Yoshi
我曾嘗試過。但是,如果我在if語句內調用另一個drawcircle(),那麼當第二個圓圈完成後,腳本將再次調用drawcircle函數來繪製第二個圓圈。 – user1311794
當然可以。雖然這不是同一個問題。第一個(你的問題)是關於時機。第二個(不是無休止地繪製圓圈)是如何跟蹤所有圈子是否完成的問題。對於第二個(*編輯*兩個問題),我會使用像一個隊列。 – Yoshi