使用 Fabric.js 选择画布上的所有对象

Posted

技术标签:

【中文标题】使用 Fabric.js 选择画布上的所有对象【英文标题】:Select All the objects on canvas using Fabric.js 【发布时间】:2014-01-02 19:05:39 【问题描述】:

有没有一种方法可以显式选择特定时间实例中存在的所有对象。 这可以很容易地使用鼠标选择所有。是否有一个代码解决方案,例如名为 Select All 的按钮,以便单击它会选择所有结构类型对象,然后我可以使用 canvas.getActiveGroup(); 将更改应用于整个 ActiveGroup 并迭代。

【问题讨论】:

【参考方案1】:

好问题。

对此没有内置方法,但您需要按照以下方式进行操作:

var objs = canvas.getObjects().map(function(o) 
  return o.set('active', true);
);

var group = new fabric.Group(objs, 
  originX: 'center', 
  originY: 'center'
);

canvas._activeObject = null;

canvas.setActiveGroup(group.setCoords()).renderAll();

代码应该是不言自明的,当您使用鼠标、shift+click 等时,它几乎就是幕后发生的事情。

【讨论】:

又是一个完美的工作解决方案。非常感谢@kangax! 如果组已经存在,此代码会导致对象跳转位置。如果您在此代码之前调用canvas.deactivateAll();,它会起作用(并取出canvas._activeObject = null; 行,因为它不再需要)。 嗨!有什么办法可以将 Shift+Click 覆盖为 Ctrl+Click? 这样的解决方案不再起作用,因为 get/set activeGroup 已从结构中删除,而只支持“activeObject”。请参阅下面 Tom-Steve 的回答。 我正在使用 typescript 并且 active 不是 object.set 中联合类型的一部分【参考方案2】:

使用当前版本的 fabric.js (2.3.1) 你可以这样做:

canvas.discardActiveObject();
var sel = new fabric.ActiveSelection(canvas.getObjects(), 
  canvas: canvas,
);
canvas.setActiveObject(sel);
canvas.requestRenderAll();

这是来自演示页面的引用:http://fabricjs.com/manage-selection

【讨论】:

【参考方案3】:

canvas.setActiveGroup 不再是一个选项。它在 2.0 版本中作为一个函数被删除

【讨论】:

【参考方案4】:

这是一个更紧凑的形式:

canvas.setActiveGroup(new fabric.Group(canvas.getObjects())).renderAll();

【讨论】:

这使我的对象的位置跳跃。【参考方案5】:
selectAllObjects() 
    this.canvas.discardActiveObject();
    this.canvas.discardActiveGroup();

    let objects: Fabric.Object[] = this.canvas.getObjects().map(function (object: Fabric.Object) 
        return object.set('active', true);
    );

    if (objects.length === 1) 
        this.canvas.setActiveObject(objects[0]);
     else if (objects.length > 1) 
        let group: Fabric.Group = new Fabric.Group(objects.reverse(), 
            canvas: this.canvas
         as any);
        group.addWithUpdate(null);
        this.canvas.setActiveGroup(group);
        group.saveCoords();
        this.canvas.trigger("selection:created", 
            target: group
        );
    

    this.canvas.renderAll();

【讨论】:

以上是关于使用 Fabric.js 选择画布上的所有对象的主要内容,如果未能解决你的问题,请参考以下文章

Fabric.js橡皮擦问题画布

在 html5 中的 fabric.js 画布上一次删除多个对象

Fabric.js 画布上的多个剪切区域

fabric.js 组成员的属性不更新?

node.js loadFromDatalessJSON 上的 fabric.js 在组中移动对象

Paper.js VS EaselJS VS Fabric.js vs KineticJS