【问题标题】:Can't manage object alignments selection with FabricJs 2无法使用 FabricJs 2 管理对象对齐选择
【发布时间】:2019-01-25 00:27:02
【问题描述】:

我曾经使用 getActiveGroup 在 FabricJS 上管理对象对齐选择,如下所示:

canvas.on("selection:created", function(e) {
    var activeObj = canvas.getActiveObject();
    console.log('e.target.type', e.target.type);
    if(activeObj.type === "group") {
        console.log("Group created");

        var groupWidth = e.target.getWidth();
        var groupHeight = e.target.getHeight();


        e.target.forEachObject(function(obj) {
            var itemWidth = obj.getBoundingRect().width;
            var itemHeight = obj.getBoundingRect().height;

            $('#objAlignLeft').click(function() {
                obj.set({
                    left: -(groupWidth / 2),
                    originX: 'left'
                });
                obj.setCoords();
                canvas.renderAll();
            });
            ...

    }
}); 

more detailed here

但现在我使用 FabricJS 2 并且 getActiveObject() 已被删除,我不知道该怎么办。我在doc 上读到我们可以使用getActiveObjects(),但它什么也没做。

请问如何使用 FabricJS 2 重现 this code 的操作(不再支持 getActiveGroup)?

【问题讨论】:

    标签: fabricjs fabricjs2


    【解决方案1】:

    多个对象的选择具有activeSelection 类型。 group 类型仅在您使用new fabric.Group([ obj1, obj2] 有目的地对多个对象进行分组时使用

    当您使用 shift 键创建多选而不是绘制选择框时,您将仅在第一个选定对象上触发 selection:created 事件,而添加到选择中的对象将触发 @987654326 @ 事件。通过从 selection:createdselection:updated 事件中调用对齐代码,您将确保每次创建多选时都会执行您的代码。

    此外,您可以使用 getScaledWidth()getScaledHeight() 来获得缩放尺寸,或者如果您只想要未缩放的宽度/高度值,则只需使用 .width.height。祝你好运!

    canvas.on({
      'selection:updated': function() {
        manageSelection();
      },
      'selection:created': function() {
        manageSelection();
      }
    });
    
    function manageSelection() {
      var activeObj = canvas.getActiveObject();
      console.log('activeObj.type', activeObj.type);
      if (activeObj.type === "activeSelection") {
        console.log("Group created");
    
        var groupWidth = activeObj.getScaledWidth();
        var groupHeight = activeObj.getScaledHeight();
    
        activeObj.forEachObject(function(obj) {
          var itemWidth = obj.getBoundingRect().width;
          var itemHeight = obj.getBoundingRect().height;
          console.log(itemWidth);
    
          $('#objAlignLeft').click(function() {
            obj.set({
              left: -(groupWidth / 2),
              originX: 'left'
            });
            obj.setCoords();
            canvas.renderAll();
          });
        });
      }
    }

    【讨论】:

    • 请问您有地方可以让我测试您的解决方案吗?因为我已经尝试过你的方法,但它不起作用,activeObj.type 永远不会返回group。它返回recttext(基于我的jsfiddle 的代码)
    • 嗨@kabrice,我已经编辑了我的答案。要检查您的选择是否包含多个对象,请使用 activeSelection 类型,而不是 group
    • 仍然不起作用,它仍然返回 recttext 作为类型。为了您的记录,我使用了FabricJS 2.3.3
    • 我想我看到了问题所在。我猜您正在使用 shift 多选而不是选择框来创建您的选择。通过从selection:createdselection:updated 事件调用对齐代码,您可以考虑这两种类型的选择方法。 see jsfiddle
    • 是的,你是对的。它现在非常棒:)。非常感谢
    猜你喜欢
    • 2015-04-22
    • 2016-07-13
    • 2017-06-18
    • 2020-11-02
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    • 2019-11-27
    • 2019-03-11
    相关资源
    最近更新 更多