Я пытаюсь разработать способ выбора объектов, которые расположены ниже и (полностью) покрыты другими объектами. Одна идея состоит в том, чтобы выбрать верхний объект, а затем через doubleclick
пройти вниз по слоям. Это то, что я в данный момент:Как выбрать покрытые объекты с помощью мыши в 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>
Как вы можете видеть, пытаясь выбрать red
прямоугольник внутри blue
один не работает. Я могу только выбрать green
или blue
. Я предполагаю, что после того, как первый doubleclick
работал (green
), щелчок снова просто выбирает blue
, поэтому следующий двойной клик сможет снова получить green
.
Есть ли способ обойти это? Любые другие идеи?
** «Любые другие идеи?» ** Конечно, если FabricJS ударил тест с множественными слоистыми прямоугольниками не легко доступен, просто перебирать прямоугольники и математически тест, если mouseX , mouseY находится внутри любого прямоугольника. См. Этот Html5-Canvas [Пример документации] (http://stackoverflow.com/documentation/html5-canvas/5017/collisions-and-intersections/17716/is-an-xy-point-inside-a-rectangle#t= 201608240434175724158). Таким образом, вам не нужно пытаться координировать клики, двойные клики и тройные символы и т. Д. ;-) – markE
@markE: Это не касается моей проблемы. Я уже знаю, какие объекты попадают в указатель мыши (это мои «_targets» в коде выше). Мне нужен механизм для 'select' объектов, которые покрываются другими. И тот, внизу, и так далее. – Fidel90
Я не гуру FabricJS, но вы не можете выбрать группу объектов с 'fabric.Group'? 'var group = new fabric.Group(); group.addWithUpdate (TargetObject); canvas.setActiveObject (группа); canvas.add (группа); ' – markE