【发布时间】:2016-12-30 08:38:42
【问题描述】:
我正在尝试开发一种方法来选择在下面分层并且(完全)被其他对象覆盖的对象。一种想法是选择顶部对象,然后通过doubleclick 向下穿过层。这是我目前得到的:
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) {
//then select the one on the layer below
_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 矩形不起作用。我只能选择green 或blue。我猜想在第一个doubleclick 工作后(green 被选中),再次点击只会选择blue,所以下面的双击只能再次获得green。
有没有办法解决这个问题?还有其他想法吗?
【问题讨论】:
-
“还有其他想法吗?” 当然,如果对多层矩形的 FabricJS 命中测试不可用,只需遍历矩形并在数学上测试 mouseX, mouseY 在任何矩形内。请参阅此 Html5-Canvas Documentation Example。这样你就不需要尝试协调点击&双击&三次点击等;-)
-
@markE:这不能解决我的问题。我已经知道鼠标指针击中了哪些对象(这些是我上面代码中的
_targets)。我需要一种机制来select被其他人覆盖的对象。和下面的,等等。 -
我不是 FabricJS 大师,但你不能用
fabric.Group选择一组对象吗?var group = new fabric.Group(); group.addWithUpdate(targetObject); canvas.setActiveObject(group); canvas.add(group);
标签: javascript canvas html5-canvas selection fabricjs