Để phát xung quanh với canvas HTML5, tôi quyết định tạo một ứng dụng vẽ một mặt đồng hồ tương tự. Mọi thứ đều tốt, ngoại trừ những dòng cũ không bị xóa theo cách mà tôi mong đợi. Tôi đã bao gồm một phần của mã dưới đây - DrawHands() được gọi một lần thứ hai:Xóa các đường kẻ được vẽ trước đây trên canvas 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);
}
Để làm cho tinh thần của các bên trên, có hai chức năng helper:
- DrawLine (x1, y1 , x2, y2, màu sắc, độ dày)
- getOtherEndOfLine (x, y, góc, chiều dài)
vấn đề là trong khi tất cả các tay được rút ra như mong đợi trong màu đen, họ không bao giờ bị xóa. Tôi hy vọng rằng kể từ khi cùng một dòng được vẽ bằng màu trắng (màu nền) nó có hiệu quả sẽ xóa những gì đã được rút ra tại thời điểm đó. Nhưng điều này dường như không đúng.
Mọi thứ tôi bị thiếu?
Nếu một người muốn xóa một dòng hoặc hình dạng cụ thể (như tôi đã làm), chứ không phải thanh toán bù trừ một khu vực hình chữ nhật, thiết lập 'ctx.globalCompositeOperation =" destination-out "' - như đã đề cập trong giải pháp andrewmu cho một [câu hỏi tương tự] (http://stackoverflow.com/questions/3328906/erasing-in-html5-canvas) - sẽ đẹp nhiều thao tác fill/stroke của bạn hoạt động giống như một công cụ tẩy. Hãy nhớ thay đổi chế độ tổng hợp lại khi bạn hoàn tất. Xem [tổng hợp và cắt của Mozilla] (https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Compositing) để biết chi tiết đầy đủ. – TheMadDeveloper
Không nhất thiết phải luôn xóa hoàn toàn canvas.Xem câu trả lời của Simon Sarris bằng cách sử dụng getImageData/putImageData, cho phép bạn khôi phục bản vẽ cho bất kỳ (các) giai đoạn trước nào của bản vẽ. – Allasso
Chỉnh sửa ở trên chú thích - nên đọc câu trả lời của mrmcgreg. – Allasso