Fabric JS - 拆分多行IText

时间:2017-07-02 09:55:51

标签: javascript jquery html5 canvas fabricjs

我正在为我的项目使用Fabric JS,我想分割多行IText,如下图所示:

split multiple lines on IText

这是我的代码:

var canvas = new fabric.Canvas("canvas", { preserveObjectStacking: true 
});

var text = new fabric.IText("Hello!\nSplit Me\nPlease....", {
  fontSize: 20,
  top: 80,
  left: 100,
  fontFamily: "Arial"
});

canvas.add(text);
canvas.renderAll();


$('#split').click(function() {

    var object = canvas.getActiveObject();

    if(!object) return false;

    if ((object.get('type') == 'i-text') && (object.getText().indexOf( "\n" ) > 0)) {

        var splitText = object.getText().split("\n");
        var group = new fabric.Group();
        var cloneObj = [];

        for(var i=0;i<=splitText.length-1;i++) {
            cloneObj[i] = fabric.util.object.clone(object);
            cloneObj[i].setText(splitText[i]);
            canvas.add(group);
            canvas.add(cloneObj[i]);
            group.addWithUpdate(cloneObj[i]);
            canvas.renderAll();
        }

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

    }
});

这是jsfiddle:https://jsfiddle.net/m74ruzwq/2/

任何帮助将不胜感激。提前谢谢。

2 个答案:

答案 0 :(得分:1)

最好的方法是从结构中获取任何textLine,它已经拆分,为每一行生成一个新对象,修复顶部值,最后渲染。

&#13;
&#13;
var canvas = new fabric.Canvas("canvas", { preserveObjectStacking: true });

var text = new fabric.IText("Hello!\nSplit Me\nPlease....", {
  fontSize: 20,
  top: 80,
  left: 100,
  fontFamily: "Arial"
});

canvas.add(text);
canvas.renderAll();


$('#split').click(function() {

		var object = canvas.getActiveObject();
		
    if(!object) return false;
    
		if (object._textLines && object._textLines.length > 1) {
      canvas.renderOnAddRemove = false;
			var group = new fabric.Group();
			var cloneObj = [];
      var options = object.toObject();
      group.canvas = canvas;
      delete options.text;
			for(var i=0; i < object._textLines.length; i++) {
				var newObj = new fabric.IText(object._textLines[i], options);
        newObj.top += i * object.fontSize * object.lineHeight;
				canvas.add(newObj);
        group.addWithUpdate(newObj);
			}
			object.remove();
      group.setCoords();
      canvas.renderOnAddRemove = true;
			canvas.setActiveGroup(group);
      canvas.renderAll();
		}
});
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.7.14/fabric.min.js"></script>
<button id="split">Split</button>
<canvas id="canvas" width="400" height="300" style="border: 1px solid #ccc"></canvas>
&#13;
&#13;
&#13;

答案 1 :(得分:-1)

任何帮助。

这是jsfiddle:http://jsfiddle.net/edvkemerovo/4ufjrrco/2/

1个按钮拆分为组。 2按钮取消组合。

   var canvas = new fabric.Canvas("canvas", { preserveObjectStacking: true });

    var text = new fabric.IText("Hello!\nSplit Me\nPlease....", {
      fontSize: 20,
      top: 80,
      left: 100,
      fontFamily: "Arial"
    });

    canvas.add(text);
    canvas.renderAll();


    $('#split').click(function() {

            var object = canvas.getActiveObject();

        if(!object) return false;

            if ((object.get('type') == 'i-text') && (object.getText().indexOf( "\n" ) > 0)) {

                var splitText = object.getText().split("\n");
          var top = object.top
                var group = new fabric.Group();
                var cloneObj = [];
          canvas.add(group);
                for(var i=0;i<=splitText.length-1;i++) {
                    cloneObj[i] = fabric.util.object.clone(object);
                    cloneObj[i].setText(splitText[i]);
            cloneObj[i].setTop(top+cloneObj[i].height*i);

                //  canvas.add(cloneObj[i]);
                    group.addWithUpdate(cloneObj[i]);
                    canvas.renderAll();
                }

                object.remove();
        //  canvas.setActiveGroup(group);
                group.setCoords();
                canvas.renderAll();

            }
    });
        $('#ungroup').click(function() {
        var group = canvas.getActiveObject();
        for(var i=0;i<= group._objects.length-1;i++) {
        var cloneObj = fabric.util.object.clone(group._objects[i]);
       cloneObj.setTop(group.top+cloneObj.height*i);
        cloneObj.left = group.left;
       cloneObj.setCoords();
       canvas.add(cloneObj);
       }
            canvas.remove(group);
        canvas.renderAll();
            });