【问题标题】:FabricJS 2- Setting fill on SVG paths when only single pathFabricJS 2-只有单个路径时在 SVG 路径上设置填充
【发布时间】:2018-12-19 16:03:21
【问题描述】:

所以在画布上添加一个 SVG 如下:

// load the svg
fabric.loadSVGFromURL(self.currentDraggedIcon, function(objects, d) {

  var iconGroup = fabric.util.groupSVGElements(objects, d);
  iconGroup.set({
    left: e.layerX,
    top: e.layerY,
    width: d.width,
    height: d.height,
    lockUniScaling: true,
    //  scaleY:self.currentObjectDesigner.scaleFactor,
    // scaleX:self.currentObjectDesigner.scaleFactor,
    dtype: 'UserIcon'
  });

  self.currentObjectDesigner.fabric.add(iconGroup);
  self.currentObjectDesigner.fabric.bringToFront(iconGroup);
  self.currentObjectDesigner.fabric.renderAll();
});

稍后有一个按钮可以将组内的路径颜色更改为红色,执行此操作的代码是:

for (var i = 0; i < self.currentObjectDesigner.selectedObject._objects.length; i++) {

  if (self.currentObjectDesigner.selectedObject.item(i).fill == findColor || self.currentObjectDesigner.selectedObject.item(i).fill == findColorAlt) {
    self.currentObjectDesigner.selectedObject.item(i).fill = color;

  }
}

self.currentObjectDesigner.selectedObject.addWithUpdate();

如果 SVG 有多个路径,这非常有效,但是当只存在一个路径时,_objects 属性不存在,因此我们无法执行循环和 item(i) 部分来设置路径上的填充。

问题是:当 _objects 不存在并且 item() 方法不存在因为它只是一个单一的路径时,我们现在如何设置填充? - 即它不是一个组。

【问题讨论】:

    标签: fabricjs fabricjs2


    【解决方案1】:

    如果存在多个路径 groupSVGElements 返回组对象,否则返回单个对象。

    演示

    var canvas = new fabric.Canvas('c');
    
    function loadSvg(url, left, top) {
      fabric.loadSVGFromURL(url, function(objects, d) {
        var iconGroup = fabric.util.groupSVGElements(objects, d);
        //for more than one path
        iconGroup.set({
          left: left,
          top: top
        })
        if (iconGroup.type == 'group') {
          //do your logic for group object
          iconGroup.item(0).fill = 'yellow';
          iconGroup.addWithUpdate();
        } else {
          iconGroup.fill = 'red';
        }
        iconGroup.set({
          scaleX: 150 / iconGroup.width,
          scaleY: 150 / iconGroup.height,
        })
        canvas.add(iconGroup);
      }, function() {}, {
        crossOrigin: 'anonymous'
      });
    
    }
    loadSvg('https://upload.wikimedia.org/wikipedia/commons/2/22/Wikimapia_logotype.svg', 10, 20);
    loadSvg('https://upload.wikimedia.org/wikipedia/commons/a/a0/Circle_-_black_simple.svg', 200, 50);
    canvas{
     border:2px solid #000;
    }
    <script src="https://rawgit.com/kangax/fabric.js/master/dist/fabric.js"></script>
    <canvas id='c' width=400 height=400></canvas>

    【讨论】:

    • 是的,但是单个对象不起作用。如果我运行 itemGroup.fill = 'red'; itemGroup.addWithUpdate() - 出现错误说 addWithUpdate 不是一个函数。单个项目上的对象与组中的对象不同。
    • @GlenElkins addWithUpdate 是组对象的方法。该单个项目是常规/普通对象,而不是在组中。
    • 好的,不用担心,但设置 itemGroup.fill = 'red' 仍然不起作用 - 只有一条路径时不会发生任何事情!
    • @GlenElkins 查看演示,还添加了单路径 svg。
    猜你喜欢
    • 2020-03-14
    • 2019-07-06
    • 1970-01-01
    • 2017-03-24
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    相关资源
    最近更新 更多