javascript - 使用 fabric js 连接两个对象

标签 javascript canvas fabricjs

我目前有一个 Canvas 应用程序,我可以在其中添加对象(形状)。这是我的 FIDDLE .您基本上单击将初始化 Canvas 的新模拟,然后您可以添加一个圆形或矩形。

我正在尝试添加一个名为“添加子项”的功能,您可以在其中单击某个对象(形状),然后单击添加子项并添加另一个对象(形状),它们都用一条线链接。与此类似的东西 DEMO .

我认为此功能的伪代码如下所示:

function addChild(){

    get getActiveObject
    draw a line/arrow connect it with getActiveObject
    draw object connected with line
    should be able to move it / strecth it around


}

我想知道这是否可行以及如何开始。请指教。

最佳答案

您需要监听 object:selected 事件以添加连接线和 object:moving 事件以更新线坐标。

// function for drawing a line
function makeLine(coords) {
    return new fabric.Line(coords, {
        fill: 'red',
        stroke: 'red',
        strokeWidth: 5,
        selectable: false
    });
}

var canvas; 
window.newAnimation = function(){
   canvas = new fabric.Canvas('canvas');

   var selectedElement = null;
   canvas.on('object:selected', function(options) {
       // we are doing t oadd a connection
       if (canvas.connect) {
           canvas.connect = false;
           var from = selectedElement.getCenterPoint();
           var to = options.target.getCenterPoint();
           var line = makeLine([from.x, from.y, to.x, to.y]);
           canvas.add(line);

           // these take care of moving the line ends when the object moves
           selectedElement.moveLine = function() {
               var from = selectedElement.getCenterPoint();
               line.set({ 'x1': from.x, 'y1': from.y });
           };
           options.target.moveLine = function() {
               var to = options.target.getCenterPoint();
               line.set({ 'x2': to.x, 'y2': to.y });
           };
       }
       selectedElement = options.target;
   });

   canvas.on('object:moving', function(e) {
        e.target.moveLine();
        canvas.renderAll();
  });
}

window.addChild = function() {
   canvas.connect = true;
}

window.addChild 跟踪是否单击了添加子项(并且应该添加到按钮的 onclick 中)以便下一个 object:selected 可以画线(否则它只是跟踪当前选择的元素)

<button onClick="addChild()">Add Child</button>

请注意,对于完整的解决方案,您需要能够取消 Add Child 并且您可能希望处理对象大小调整(目前,当您移动对象时该行会更新,但在您调整对象大小时不会更新)


fiddle - http://jsfiddle.net/ctcdaxop/

关于javascript - 使用 fabric js 连接两个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32291834/

相关文章:

javascript - JavaScript 类属性的 Canvas 绘制图像错误

javascript - 如何在不点击鼠标的情况下触发 'object:selected'?

php - 网络抓取数据的传递

javascript - 将 Fabric.js 文本转换为路径

javascript - Fabric.js : Resize canvas and continue working

javascript - 重新加载网页后如何在 JavaScript 中保留多个表单值?

javascript - Internet Explorer 11 是否支持多点触控?

javascript - 将 innerHTML 与 querySelectorAll 结合使用

javascript - Angular JS 没有正确编码 JSON 以传递 get 请求?

html - Canvas 时钟