我想在畫布上添加撤消功能。但它不能正常工作。畫布上的撤消操作不正確
問題 -
讓我們說,我有單獨繪製3線在畫布上,但是當我已經開始做就可以撤消,
第2點擊 - 它顯示2行
3點擊 - 它顯示1行
當我開始在畫布上再次戰平,重繪即所有行,所有三線重畫
請檢查此fiddle和借鑑它
我下面的代碼
HTML
<canvas id="c" width="500" height="300"></canvas> <input type='button' onClick='undoDrawOnCanvas();' id='btnUndo' value='Undo drawing'>
CSS
canvas { border: 1px solid #ccc }
JS
var el = document.getElementById('c');
var ctx = el.getContext('2d');
var isDrawing;
var restorePoints = [];
el.onmousedown = function(e) {
isDrawing = true;
ctx.lineWidth = 10;
ctx.lineJoin = ctx.lineCap = 'round';
ctx.moveTo(e.clientX, e.clientY);
};
el.onmousemove = function(e) {
if (isDrawing) {
ctx.lineTo(e.clientX, e.clientY);
ctx.stroke();
}
};
el.onmouseup = function() {
isDrawing = false;
saveRestorePoint();
};
function saveRestorePoint() {
var oCanvas = document.getElementById("c");
var imgSrc = oCanvas.toDataURL("image/png");
restorePoints.push(imgSrc);
}
function undoDrawOnCanvas() {
if (restorePoints.length > 0) {
var oImg = new Image();
oImg.onload = function() {
ctx.clearRect(0, 0, el.width, el.height);
ctx.drawImage(oImg, 0, 0);
}
oImg.src = restorePoints.pop();
}
}
@TheFourthBird是正確的,你的問題是,你不叫'ctx.beginPath'在mousedown事件。另外,爲了取消功能,避免使用'toDataURL',這是一種非常不合適的方式。相反,你應該保存所有的繪圖操作(這裏很容易將所有座標保存在數組中)。 – Kaiido