如何在 Fabric.js 中处理组中单个对象的事件?
How can I handle events, in Fabric.js, on a individual object within a group?
假设我有 3 个圈子并将它们添加到一个组中。
var circle1 = new fabric.Circle({
radius: 50,
fill: 'red',
left: 0
});
var circle2 = new fabric.Circle({
radius: 50,
fill: 'green',
left: 100
});
var circle3 = new fabric.Circle({
radius: 50,
fill: 'blue',
left: 200
});
var group = new fabric.Group([ circle1, circle2, circle3 ], {
left: 200,
top: 100
});
canvas.add(group);
我如何处理 circle1 的鼠标事件?
或者换句话说,我如何知道鼠标点击了组中的哪些对象?
当事件触发时,您可以通过 canvas 侦听器回调检查目标对象,我不确定对象是否具有 属性 形状类型。否则你可以在添加圆圈时分配一个 属性 说它是一个圆圈,然后通过事件将其拾取。
canvas.on('mouse:up', function(e) {
console.log(e.target); // should contain info on the clicked object
});
当您将对象组合在一起时,您使组对象的行为像一个对象,因此它会像任何其他单个对象一样旋转、移动、缩放、侦听事件。
你不能只听单个对象上的任何事件,因为现在所有的事件都只形成一个对象。
当然,组对象具有项目方法 item(index)、getObjects(),因此您可以获得单个对象和 get/update 它们的属性。
自定义解决方案可以是:
- 获取mouse:down事件
- 获取指针位置
- 读取组对象的所有_objects
- 将鼠标指针的位置与 activeObj._objects[item] 的位置进行比较
- 如果它适合你已经找到了子对象
像这样:
canvas.observe('mouse:down', function (options)
{
pos = canvas.getPointer(options.e);
console.log("POSITION"+pos);
activeObj = canvas.getActiveObject();
if (Math.abs(pos.x - activeObj.left) < 10 && Math.abs(pos.y - activeObj.top) < 30 && Math.abs(pos.y - activeObj.top) > 10) {
console.log("connector selected");
}
});
这里针对该问题进行了另一个讨论,如果你想看一看:
https://github.com/kangax/fabric.js/issues/485
希望有所帮助,祝你好运
circle2.on('mouseup', function(event) {
console.log(`circle2 mouseup`);
});
假设我有 3 个圈子并将它们添加到一个组中。
var circle1 = new fabric.Circle({
radius: 50,
fill: 'red',
left: 0
});
var circle2 = new fabric.Circle({
radius: 50,
fill: 'green',
left: 100
});
var circle3 = new fabric.Circle({
radius: 50,
fill: 'blue',
left: 200
});
var group = new fabric.Group([ circle1, circle2, circle3 ], {
left: 200,
top: 100
});
canvas.add(group);
我如何处理 circle1 的鼠标事件?
或者换句话说,我如何知道鼠标点击了组中的哪些对象?
当事件触发时,您可以通过 canvas 侦听器回调检查目标对象,我不确定对象是否具有 属性 形状类型。否则你可以在添加圆圈时分配一个 属性 说它是一个圆圈,然后通过事件将其拾取。
canvas.on('mouse:up', function(e) {
console.log(e.target); // should contain info on the clicked object
});
当您将对象组合在一起时,您使组对象的行为像一个对象,因此它会像任何其他单个对象一样旋转、移动、缩放、侦听事件。 你不能只听单个对象上的任何事件,因为现在所有的事件都只形成一个对象。
当然,组对象具有项目方法 item(index)、getObjects(),因此您可以获得单个对象和 get/update 它们的属性。
自定义解决方案可以是:
- 获取mouse:down事件
- 获取指针位置
- 读取组对象的所有_objects
- 将鼠标指针的位置与 activeObj._objects[item] 的位置进行比较
- 如果它适合你已经找到了子对象
像这样:
canvas.observe('mouse:down', function (options)
{
pos = canvas.getPointer(options.e);
console.log("POSITION"+pos);
activeObj = canvas.getActiveObject();
if (Math.abs(pos.x - activeObj.left) < 10 && Math.abs(pos.y - activeObj.top) < 30 && Math.abs(pos.y - activeObj.top) > 10) {
console.log("connector selected");
}
});
这里针对该问题进行了另一个讨论,如果你想看一看: https://github.com/kangax/fabric.js/issues/485
希望有所帮助,祝你好运
circle2.on('mouseup', function(event) {
console.log(`circle2 mouseup`);
});