0
我想开发一种方法来选择分层下面和(完全)被其他对象覆盖的对象。一个想法是选择最上面的对象,然后通过向下穿过层。这是我的时刻了:如何通过鼠标在fabricJS中选择遮盖物体?
var canvas = new fabric.Canvas("c");
fabric.util.addListener(canvas.upperCanvasEl, "dblclick", function (e) {
var _canvas = canvas;
var _mouse = _canvas.getPointer(e);
var _active = _canvas.getActiveObject();
if (e.target) {
var _targets = _canvas.getObjects().filter(function (_obj) {
return _obj.containsPoint(_mouse);
});
//console.warn(_targets);
for (var _i=0, _max=_targets.length; _i<_max; _i+=1) {
//check if target is currently active
if (_targets[_i] == _active) {
\t //then select the one on the layer below
\t _targets[_i-1] && _canvas.setActiveObject(_targets[_i-1]);
break;
}
}
}
});
canvas
.add(new fabric.Rect({
top: 25,
left: 25,
width: 100,
height: 100,
fill: "red"
}))
.add(new fabric.Rect({
top: 50,
left: 50,
width: 100,
height: 100,
fill: "green"
}))
.add(new fabric.Rect({
top: 75,
left: 75,
width: 100,
height: 100,
fill: "blue"
}))
.renderAll();
canvas {
border: 1px solid;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.6.3/fabric.min.js"></script>
<canvas id="c" width="300" height="200"></canvas>
正如你所看到的,试图从blue
一个内选择red
矩形没有工作。我只能选择或blue
。我猜想,在第一个doubleclick
工作后(选择了),再次点击只需选择blue
,因此以下doubleclick只能再次获得。
有没有办法解决这个问题?任何其他想法?
**“任何其他的想法?” **当然,如果一个FabricJS打多层矩形的测试是没有现成的,只是通过rects迭代,如果mouseX数学测试,mouseY在任何矩形内。看到这个Html5-Canvas [Documentation Example](http://stackoverflow.com/documentation/html5-canvas/5017/collisions-and-intersections/17716/is-an-xy-point-inside-a-rectangle#t= 201608240434175724158)。这样您就不需要尝试协调点击次数和双击和三次点击等;-) – markE
@markE:这不是解决我的问题。我已经知道哪些对象被鼠标指针击中(这些是我上面代码中的'_targets')。我需要一种机制来“选择”被他人覆盖的对象。下面的那个,等等。 – Fidel90
我不是FabricJS大师,但不能用'fabric.Group'选择一组对象吗? 'var group = new fabric.Group(); group.addWithUpdate(targetObject); canvas.setActiveObject(基); canvas.add(组);' – markE