0

这是我的页面 http://www.dev.1over0.com/canvas/canvas_web.html

我遇到了撤消功能的问题——我想我已经接近了,但问题就在这里

首先,我将告诉您绘图应用程序的基础知识—— 如果您查看您将看到的 js 文件,我将分层四个不同的画布http://www.dev.1over0.com/canvas/js/canvas_web.js在最上面我对我在画布上所做的所有评论

当用户使用工具进行绘制时——它实际上是首先在 imageTemp 画布上临时绘制的——每个工具都有自己的对象(铅笔、矩形、线条),其中包含用于 mousedown、mousemove 和 mouseup 事件的函数

在 mouseup 事件结束时,它调用此函数

function img_update() {
contexto.drawImage(canvas, 0, 0);
saveActions();
context.clearRect(0, 0, canvas.width, canvas.height);
}

在这里,临时画布上的图像最终被绘制在 imageView 画布上,因此基本上每次都会擦除 imageTemp 画布

因此,对于撤消功能,我首先声明一个空数组

var undoHistory = [];

我还声明了一个新图像

var undoImg = new Image();

当 img_update 被调用时——它调用另一个函数 saveActions

function saveActions() {
var imgData = canvaso.toDataURL("image/png");
undoHistory.push(imgData);
$('#undo_canvas button').removeAttr('disabled');
}

在这个函数中——我本质上是将新绘制的图像画布保存到 undoHistory 数组中这似乎工作正常(我相信)所以每次更新永久 imageView 画布后都会将该状态保存到数组中

现在,如果您注意到一旦绘制图像并将其保存到 imageView 画布,撤消按钮就会启用

因此,如果您单击撤消按钮,它会调用此函数

function undoDraw() {
if(undoHistory.length > 0){ 
$(undoImg).load(function(){
contexto.drawImage(undoImg, 0,0);
 });
undoImg.src = undoHistory.pop();
if(undoHistory.length == 0) { 
$('#undo_canvas button').attr('disabled','disabled');
}
}
}                              

在这里,我要做的是获取先前的图像状态并将其绘制在画布上它的工作方式会影响图像的 z-index 但不会摆脱图像而且您必须单击它两次这让我很困惑

因此,如果您可以尝试在彼此的顶部绘制三个矩形您可以单击撤消按钮,它会影响 z-index - 单击它三下您会明白我的意思,所以它有点工作,也许;-{

4

1 回答 1

1

在绘制最后一个图像之前必须清除画布,否则它将在前一个画布上绘制图像;此外,您弹出最后一张图片,这是您刚刚推入的图片(这就是您必须单击两次的原因)。所以尝试这样的事情(你可能需要调整代码,我不确定它是否可以开箱即用)

function undoDraw(){
   if(undoHistory.length > 0){ 
      $(undoImg).load(function(){
          contexto.clearRect(0,0, canvas.width, canvas.height);     
          contexto.drawImage(undoImg, 0,0);
     });
   undoHistory.pop();
   undoImg.src = undoHistory.pop();
   if(undoHistory.length == 0) { 
   $('#undo_canvas button').attr('disabled','disabled');
        }
     }                
}
于 2012-06-22T15:20:04.003 回答