Холсты с двойной буферизацией.Вам нужно будет отложить каждый шаг анимации, используя setTimeout()
, чтобы дать холсту возможность нарисовать ваши изменения. Обновление: См. requestAnimationFrame
как альтернативу setTimeout()
.
Я создал один пример для вас, который рисует каждый из сегментов вашего прямоугольника, вызываяконтекстный метод и пауза.Я думаю, что знаю конкретную анимацию, которую вы ищете, и это не так, но, надеюсь, она даст вам хорошее начало.
Код ниже и демонстрация здесь: http://jsfiddle.net/q8GcR/
function animateRoundRect(ctx, x, y, width, height, radius, delay) {
commands = [
['moveTo', x,y+radius],
['lineTo', x,y+height-radius],
['quadraticCurveTo', x,y+height,x+radius,y+height],
['lineTo', x+width-radius,y+height],
['quadraticCurveTo', x+width,y+height,x+width,y+height-radius],
['lineTo', x+width,y+radius],
['quadraticCurveTo', x+width,y,x+width-radius,y],
['lineTo', x+radius,y],
['quadraticCurveTo', x,y,x,y+radius]
];
function draw() {
var args = commands.shift();
var method = args.shift();
ctx[method].apply(ctx, args);
ctx.stroke();
if (commands.length) {
setTimeout(draw, delay);
}
}
ctx.beginPath();
draw();
}
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
ctx.lineWidth = 3;
ctx.strokeStyle = '#f00';
animateRoundRect(ctx, 20, 20, 250, 100, 10, 500);