Para jugar con el lienzo HTML5, decidí crear una aplicación que dibujara una esfera analógica. Todo está bien, excepto que las líneas antiguas no se borran de la manera que yo esperaría. He incluido parte del código de abajo - DrawHands() es llamado una vez por segundo:Borrado de líneas previamente dibujadas en un lienzo HTML5
var hoursPoint = new Object();
var minutesPoint = new Object();
var secondsPoint = new Object();
function drawHands()
{
var now = new Date();
drawLine(centerX, centerY, secondsPoint.X, secondsPoint.Y, "white", 1);
var seconds = now.getSeconds();
secondsPoint = getOtherEndOfLine(centerX, centerY, 2 * Math.PI/60 * seconds, 0.75 * radius);
drawLine(centerX, centerY, secondsPoint.X, secondsPoint.Y, "black", 1);
drawLine(centerX, centerY, minutesPoint.X, minutesPoint.Y, "white", 3);
var minutes = now.getMinutes();
minutesPoint = getOtherEndOfLine(centerX, centerY, 2 * Math.PI/60 * minutes, 0.75 * radius);
drawLine(centerX, centerY, minutesPoint.X, minutesPoint.Y, "black", 3);
drawLine(centerX, centerY, hoursPoint.X, hoursPoint.Y, "white", 3);
var hours = now.getHours();
if (hours >= 12) { hours -= 12; } // Hours are 0-11
hoursPoint = getOtherEndOfLine(centerX, centerY, (2 * Math.PI/12 * hours) + (2 * Math.PI/12/60 * minutes), 0.6 * radius);
drawLine(centerX, centerY, hoursPoint.X, hoursPoint.Y, "black", 3);
}
para dar sentido a lo anterior, hay dos funciones auxiliares:
- drawLine (x1, y1 , x2, y2, color, grosor)
- getOtherEndOfLine (x, y, ángulo, longitud)
El problema es que mientras todas las manos se ven inmersos como se esperaba en negro, que nunca se borran. Yo esperaría que, dado que la misma línea se dibuja en blanco (el color de fondo) borraría efectivamente lo que se dibujó previamente en ese punto. Pero este no parece ser el caso.
¿Algo que me falta?
Si hubiera que desea borrar una línea o una forma específica (como yo), en lugar de despejar una zona rectangular, estableciendo 'ctx.globalCompositeOperation =" destination-out "' - como se menciona en la solución de andrewmu a una [pregunta similar] (http://stackoverflow.com/questions/3328906/erasing-in-html5-canvas) - will pretty hace que sus operaciones de relleno/trazo actúen como una herramienta de borrador. Recuerde cambiar el modo de composición cuando haya terminado. Consulte la [composición y recorte de Mozilla] (https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Compositing) para obtener detalles completos. – TheMadDeveloper
No es necesario borrar siempre el lienzo por completo.Vea la respuesta de Simon Sarris usando getImageData/putImageData, que le permite restaurar el dibujo a cualquier fase anterior del dibujo. – Allasso
Corrección del comentario anterior: debería leer la respuesta de mrmcgreg. – Allasso