【发布时间】:2011-12-07 09:18:54
【问题描述】:
我正在使用 HTML5 画布开发一个画家程序。我创建了一个绘图工具,用户可以在其中拖动和移动鼠标。
我有一个监听 mousemove 事件的监听器,它会画短线:
Painter.mainCanvas.beginPath();
Painter.mainCanvas.moveTo(Painter.lastX, Painter.lastY);
Painter.lastX = e.offsetX;
Painter.lastY = e.offsetY;
Painter.mainCanvas.lineTo(Painter.lastX, Painter.lastY);
Painter.mainCanvas.stroke();
一切正常,直到我将全局 Alpha 设置为
我尝试了另一种方法,当 mousemove 触发时,它只在 mouseup 触发时使用 lineTo() 和 stroke()。
这解决了重复绘制的问题,但也引入了一个新问题:当用户打算绘制两次相同的点时,即交叉线没有mouseup,该点不会被绘制两次。因为lineTo() 函数不会在没有笔划的情况下画两次点。
【问题讨论】:
-
对于未来的读者:下面是一个相关问题和答案的链接,该问题与透明度有关的绘画以及子路径如何覆盖不良行为。 stackoverflow.com/a/6636105/377205
-
@liuyanghejerry 您的绘画网络应用程序在任何地方都可用吗?我现在正在做同样的事情,我也有同样的困境(是否使相交线加起来)。所以,在我看来,您的绘画应用程序可能有点相似。我的目前已经有大约 900 行了,而且运行良好,但我也会觉得看到你的应用程序很有趣。如果你愿意,我也会在它上线时发布一个链接。
-
@Joeytje50 太糟糕了,该项目已关闭多年。要处理该问题,您不需要使用默认的
lineTo或stroke。相反,要使线相交,您需要逐点绘制每条线。看到这个:losingfight.com/blog/2007/08/18/… -
@liuyanghejerry 我这样做的方式:我在
mousedown上getImageData,然后只是putImageData(oldData),然后是stroke。这样,您将整个画布重置为笔画之前,然后重新绘制整个画布。我正在考虑切换到更有效的方法:将<svg>放在画布顶部,并将所有绘图指向它:使用<path>创建线条并将画笔传递的坐标保存在数组中.然后,在mouseup上,只需删除<path>,使用lineTos 在画布上遵循相同的坐标。
标签: html canvas vector-graphics