爲了充分利用HTML5畫布,我決定製作一個繪製模擬錶盤的應用程序。一切都很好,除了舊的線條不會以我期望的方式擦除。我已經包含下面的代碼的一部分 - )DrawHands(被調用一次,第二:擦除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);
}
作出上述感,還有兩個輔助功能:
- 的drawLine(X1,Y1 ,X2,Y2,顏色,厚度)
- getOtherEndOfLine(X,Y,角度,長度)
的問題是,雖然預期在黑色的所有手中拿得出,他們永遠不會抹去。我認爲,因爲同一條線以白色(背景色)繪製,它將有效地抹去以前繪製的那一點。但似乎並非如此。
我錯過了什麼?
如果一個人要清除特定行或形狀(像我一樣),而不是清除一個矩形區域,設置'ctx.globalCompositeOperation =「destination-out」' - 正如andrewmu的解決方案中提到的[類似問題](http://stackoverflow.com/questions/3328906/erasing-in-html5-canvas) - 會很漂亮使您的填充/中風操作更像橡皮擦工具。請記住在完成後更改合成模式。查看[Mozilla的合成和裁剪](https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Compositing)瞭解完整的細節。 – TheMadDeveloper
沒有必要總是完全清除畫布。請參閱Simon Sarris的答案,使用getImageData/putImageData,它允許您將繪圖恢復到繪圖的任何先前階段。 – Allasso
糾正上面的評論 - 應該讀mrmcgreg的答案。 – Allasso