2017-03-26 23 views
1

我在canva的中心创建了一条垂直线,我希望我的形状可以沿着它的中心对齐,当它接近它时就在线上(用户可以拿它如果他不想对齐)。按扣形状以FabricJS为中心

我和我的jsfiddle一个问题:https://jsfiddle.net/z0u05hee/5/

的问题是形状移动时,它保持块线附近的中心,我不能把它弄出来了。

这里是我的FabricJS代码:

var canvas = new fabric.Canvas('c', { selection: false }); 

var line9 = new fabric.Line([ 
    canvas.width/2, 0, 
    canvas.width/2, canvas.width 
],{ 
    stroke: 'green', 
}) 

line9.selectable = false; 
line9.evented = false; 
canvas.add(line9); 

canvas.add(new fabric.Circle({ 
    left: 10, 
    top: 100, 
    radius: 50, 
    fill: '#9f9', 
    originX: 'left', 
    originY: 'top', 
    centeredRotation: true 
})); 

canvas.on('object:moving', function(options) { 
    if (Math.round(options.target.left) < (canvas.width/2) - 15 || 
    Math.round(options.target.left) > (canvas.width/2) + 15) { 
     options.target.set({ 
     left: Math.round(canvas.width/2), 
     }).setCoords(); 
    } 
}); 

我应该如何修复我的代码?


UPDATE:

canvas.on('object:moving', function(options) { 
    if (Math.round(options.target.left) >= (canvas.getActiveObject().getWidth()) - 20 && Math.round(options.target.left) <= (canvas.getActiveObject().getWidth()) + 20) { 
     options.target.set({ 
     left: (canvas.width/2) - canvas.getActiveObject().getWidth()/2, 
     }).setCoords(); 
    } 
}); 

这个工作,但是当我缩放形状中心点改变它的协调。

+0

我很难理解你想要的行为是什么。你能解释一下吗? – jakeehoffmann

+0

@jakeehoffmann是的,我希望我的圆形形状在水平靠近线条时水平对齐中心。用户可以随时从中心脱下形状。 – Lindow

回答

1

如果我理解正确的话,这应该这样做:

fabricjs snap to grid

和一个小的调整你的代码(相关部分):

var snapZone = 15; 
canvas.on('object:moving', function(options) { 
    var objectMiddle = options.target.left + options.target.getWidth()/2; 
    if (objectMiddle > canvas.width/2 - snapZone && 
    objectMiddle < canvas.width/2 + snapZone) { 
    options.target.set({ 
     left: canvas.width/2 - options.target.getWidth()/2, 
    }).setCoords(); 
    } 
}); 

而且所有重要的jsfiddle更新, https://jsfiddle.net/rekrah/9k9hd49u/

+0

感谢您一如既往的快速回答:)当形状缩放比较大时,您的问题与我相同,中心更改它的位置,我将更新我作为代码的当前位置,同时使用对象宽度,以便它不仅适用于圆形。 – Lindow

+1

我更新了我的答案。需要帮助请叫我? –

+0

完美:)感谢 – Lindow