首先,为了简单起见,这里是一个关于如何用鼠标和 KineticJS 绘制基本线条的小提琴:http://jsfiddle.net/projeqht/fF3hh/
假设你已经在舞台上有两个圆圈,你需要画一条线来连接它们。
我们可以使用e.targetNode来选择每个事件(mousedown、mouseup)上的节点,例如:
layer.on("mousedown", function (e) {
var nodeDown = e.targetNode;
}
layer.on("mouseup", function (e) {
var nodeUp = e.targetNode;
}
我们需要检查 nodeDown 的父级是否是 Kinetic.Group 或其他东西。
- 如果目标节点
nodeDown有一个Kinetic.Group作为父节点,我们可以使用这个Group来存储新行,第二个目标节点nodeUp。
- 如果目标节点
nodeUp没有父节点的Kinetic.Group,我们需要查看nodeUp是否有父节点的组。如果nodeUp 有一个 Kinetic.Group 作为父节点,那么我们可以使用该 Group 来存储新行和第一个目标节点 nodeDown。
- 如果
nodeDown 或nodeUp 都没有父组,那么我们需要为它们创建一个新组,并将所有 3 个形状(2 个圆和一条线)添加到该新组。
使用本教程了解如何将形状从一组移动到另一组:http://www.html5canvastutorials.com/kineticjs/html5-canvas-move-shape-to-another-container-with-kineticjs/
此外,如果您将一个形状从一个组移动到另一个组,您可能需要remove() 或destroy() 多余的组(如果不再需要)。
在绘制线条时,您必须禁用拖动形状,以便您可以使用鼠标拖动和绘制。您可以通过执行类似的操作来做到这一点:
function stopDrag() {
for (var i=0; i<layer.children.length; i++) {
layer.children[i].setDraggable(false);
}
}
function startDrag() {
for (var i=0; i<layer.children.length; i++) {
layer.children[i].setDraggable(true);
}
}
这将使图层的所有子级都可拖动和不可拖动,但您可能希望通过比选择layer.children 更具体来限制这一点。我喜欢在这里使用的一个好技巧是将所有可拖动的组命名为“draggable_shapes”,然后使用var draggableArray = stage.get('.draggable_shapes') 选择所有允许拖动的组,然后您可以循环遍历该数组和setDraggable()。
另外一点需要注意的是,Line 的 X 和 Y 坐标计算起来会有点棘手,这取决于它是否有一个 Group 作为父级或一个 Layer。如果 Line 被分组,则 Line 的坐标将相对于 Group 位置,否则 Line 的坐标将相对于 Stage(左上角)。
这将使您开始将一条线与两个不同的圆圈连接起来。如果您希望线条仅连接在圆圈的外缘上,则由您来执行坐标逻辑。
也许您可能想在每个圆圈后面添加一个透明矩形(属性opacity: 0),以便在鼠标按下矩形时,您将调用drawLine() 开始绘制一条线。否则,如果用户单击圆圈,它将拖动组。至少它具有与 Lucid Chart 应用程序类似的功能。
自定义命中函数 (http://www.html5canvastutorials.com/kineticjs/html5-canvas-kineticjs-custom-hit-function-tutorial/) 可能是一种更简洁的方法,但我并不是 100% 使用自定义命中函数,其他人可能更了解。
如果您需要进一步的帮助,请告诉我。祝你好运!