我在搞乱 kineticjs,我正在尝试构建一个鼠标工具,让你可以在单层上擦除东西。我知道如果我的背景是白色的,我可以制作白线以产生“橡皮擦”效果,但我的问题是我的背景是图像(它们不会擦除背景图像),所以画白线根本不会擦除它。我需要能够通过鼠标坐标实际擦除部分线条。有没有人这样做或知道如何
3 回答
是的,您既可以在 KineticJS 中绘制手绘线,也可以使用手绘橡皮擦。
然而,解决方案相当复杂。
先决条件:
我假设在您乱搞的过程中,您已经学会了如何监听鼠标事件并保存那些 mouseXY,以便让用户“拖动”绘制一条折线。
解决方案:
该解决方案涉及使用自定义 Kinetic.Shape,它为您提供比预定义 Kinetic 对象更大的灵活性。
Kinetic.Shape 为您提供了一个完整的画布上下文。
您可以使用context.moveTo
and multiplecontext.lineTo
让用户拖动手绘线。
有了完整的上下文,您还可以使用合成。
具体来说,您可以使用“destination-out”合成,这会使绘制的任何新线充当橡皮擦。
使用“destination-out”...任何先前绘制的线都被新线“擦除”。
您的解决方案概述:
- 通过在拖动时捕获所有单个点,让用户在画布上拖动绘制一条折线。
- 捕获用户在拖动该线时是处于“绘制”还是“擦除”模式。
- 使用自定义 Kinetic.Shape 绘制线条或使用合成擦除线条。
- 在“draw”模式下,设置 context.globalCompositeOperation=”source-over” 并绘制那条线。
- 在“擦除”模式下,设置 context.globalCompositeOperation="destination-out" 拖动橡皮擦。
一个复杂的问题是 Kinetic.Shape 给你的上下文是一个真正的画布上下文的包装器。
它将您限制为一个 context.beginPath,并且每个 context.beginPath 只能使用 1 种复合模式。由于您需要有多种合成模式(绘图与橡皮擦),因此您需要知道如何获得真正的上下文画布而不是 Kinetic.Shapes 包装的上下文。
就是这样:
var sketchpad = new Kinetic.Shape({
drawFunc: function(context) {
// get a true canvas context, not a "wrapped" context
context=this.getContext()._context;
// save the context state
context.save();
// then you can use multiple beginPath's
// and therefore have multiple composites.
context.beginPath();
context.globalCompositeOperation="source-over";
// draw a polyline using your saved line-points
context.stroke();
context.beginPath();
context.globalCompositeOperation="destination-out";
// draw a polyline which acts like an eraser
context.stroke();
// restore the context state
context.restore();
},
stroke: 'black',
strokeWidth: 4
});
“有没有人做过这个”
恐怕没有。您绘制的线是一个对象。将其作为一个整体移除很简单。
如果您不想使用橡皮擦之类的用例,则很难将线条分成几个部分,这些部分保留在绘图中,而那部分则没有。
但是,如果您的线是一组像素会容易得多,但一组像素不是一条线。
我知道已经很晚了,但是当我搜索橡皮擦时,我首先找到了这个链接,但我没有找到一个好的解决方案,所以我创建了一个新的,她是: 如何使用 kineticjs 5.1.0 制作橡皮擦作用于多层?