【问题标题】:FabricJS After rendering, group and control box have wrong positionFabricJS 渲染后,组和控制框位置错误
【发布时间】:2016-11-11 15:57:28
【问题描述】:

我想制作网格并使其可选择。我有以下生成网格的方法:

function getGrid(width, height, count, name) {

        var oGridGroup = new fabric.Group([], {left: 0, top: 0, width: width, height: height, selection: true});
        var gridCountCell = count || 5;

        gridSizeWidth = width / gridCountCell - 0.3;
        gridSizeHeight = height / gridCountCell - 0.3;
        var lineOption = {stroke: '#ccc', strokeWidth: 1};

        for (var i = Math.ceil(width / gridSizeWidth); i--;) {           
            oGridGroup.add(new fabric.Line([gridSizeWidth * i, 0, gridSizeWidth * i, height], lineOption));
        }
        for (var i = Math.ceil(height / gridSizeHeight); i--;) { 
            oGridGroup.add(new fabric.Line([0, gridSizeHeight * i, width, gridSizeHeight * i], lineOption));
        }
        if(name) {
            oGridGroup.set({name: name})
        }

        return oGridGroup;
    }

如您所见,我在创建组时设置了四个属性。问题是该组被呈现在错误的位置。它有一些偏移量。但是,如果我在创建对象时删除widthheight,则组具有正确的位置,但我无法选择它,因为widthheight 为零。这是DEMO,运行它并尝试选择网格,您将看到偏移量。然后,评论 widthheight 以查看差异。

如何解决?

附言。我尝试使用setCoords 方法,但没有帮助。

【问题讨论】:

    标签: html5-canvas fabricjs


    【解决方案1】:

    您可以通过先创建线条来修复它,然后创建一个组,传递一个包含对线条的引用的数组:

    var lines = [];
    for (var i = Math.ceil(width / gridSizeWidth); i--;) {           
      lines.push(new fabric.Line([gridSizeWidth * i, 0, gridSizeWidth * i, height], lineOption));
    }
    for (var i = Math.ceil(height / gridSizeHeight); i--;) { 
      lines.push(new fabric.Line([0, gridSizeHeight * i, width, gridSizeHeight * i], lineOption));
    }               
    var oGridGroup = new fabric.Group(lines, {left: 0, top: 0, width: width, height: height, selection: true});
    

    请看这里:http://jsfiddle.net/pevtwgcL/2/

    【讨论】:

    • 你知道为什么我的代码会出现这种情况吗?我问是因为,向现有组添加新形状时我有同样的问题吗?例如,我们有将矩形添加到选定组的按钮:var newRect= new fabric.Rect({...}};selectedGroup.add(newRect)
    • 请使用addWithUpdate() 而不是add(),像这样:selectedGroup.addWithUpdate(newRect)
    • 当你对几个对象进行分组时,Fabric 会修改对象的坐标并保持它们相对于组中心。 add() 方法只是将一个新对象添加到集合中,并且不会更新其位置,因此它会弄乱组。因此,将对象添加到现有组的安全方法是使用addWithUpdate 方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 2017-04-25
    • 1970-01-01
    相关资源
    最近更新 更多