horizontal/vertical 行的 FabricJs targetFindTolerance

FabricJs targetFindTolerance for horizontal/vertical lines

我正在创建线条并将 "perPixelTargetFind" 值设置为 true。如果一条线是对角线,这很完美,它会在我的 targetFindTolerance 的边界中找到,该边界当前为 20 像素。但是,如果一条线是水平或垂直的,则 targetFindTolerance 似乎不起作用。

这是 jsfiddle 的 link:http://jsfiddle.net/droeqgro/

如果您将鼠标移近对角线,您可以 select 它在到达它之前 20 像素,但如果您尝试对其他两条线进行同样的操作,则它不起作用。如果你 select f.e。水平线并将其旋转到对角线位置,您不能 select 在 20 像素边界内。

这是我的代码:

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

/*_____________Adding shapes_______________*/
canvas.add(new fabric.Line([50, 100, 200, 200], {
  left: 50,
  top: 50,
    stroke: 'black',
    perPixelTargetFind: true,
  strokeWidth: 5
}));

canvas.add(new fabric.Line([50, 100, 200, 100], {
  left: 50,
  top: 250,
    stroke: 'green',
    perPixelTargetFind: true,
  strokeWidth: 5
}));


canvas.add(new fabric.Line([50, 100, 50, 200], {
  left: 140,
  top: 350,
    stroke: 'green',
    perPixelTargetFind: true,
  strokeWidth: 5
}));

例如,请参阅 Jsfiddle 和 select 三行。

非常感谢。 :)

这似乎是 FabricJS 中的一个错误。一个 hacky 解决方案是像这样覆盖 containsPoint 函数:

function fakeContainsPointFunction(point) { 
  var isTransparent = canvas.isTargetTransparent(this, point.x, point.y);
  return !isTransparent; 
}

canvas.item(1).containsPoint = fakeContainsPointFunction.bind(canvas.item(1));
canvas.item(2).containsPoint = fakeContainsPointFunction.bind(canvas.item(2));

请在此处查看更新的 fiddle:http://jsfiddle.net/droeqgro/3/