2017-07-02 9 views
-3

私は私のプロジェクトのためのファブリックJSを使用していますが、私は下の画像のように、複数行のiTextを分割したい:ここファブリック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/

助けていただければ幸いです。前もって感謝します。

答えて

1

最良の方法は、それがすでに分割している生地から任意のテキスト行を取り、各ラインのための新しいオブジェクトを生成し、トップ値を修正し、最後にレンダリングすることです。

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() { 
 

 
\t \t var object = canvas.getActiveObject(); 
 
\t \t 
 
    if(!object) return false; 
 
    
 
\t \t if (object._textLines && object._textLines.length > 1) { 
 
     canvas.renderOnAddRemove = false; 
 
\t \t \t var group = new fabric.Group(); 
 
\t \t \t var cloneObj = []; 
 
     var options = object.toObject(); 
 
     group.canvas = canvas; 
 
     delete options.text; 
 
\t \t \t for(var i=0; i < object._textLines.length; i++) { 
 
\t \t \t \t var newObj = new fabric.IText(object._textLines[i], options); 
 
     newObj.top += i * object.fontSize * object.lineHeight; 
 
\t \t \t \t canvas.add(newObj); 
 
     group.addWithUpdate(newObj); 
 
\t \t \t } 
 
\t \t \t object.remove(); 
 
     group.setCoords(); 
 
     canvas.renderOnAddRemove = true; 
 
\t \t \t canvas.setActiveGroup(group); 
 
     canvas.renderAll(); 
 
\t \t } 
 
});
<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>

+0

あなたの助けをいただき、ありがとうございます。しかし、私はこのエラーメッセージ "Uncaught TypeError:未定義のプロパティ '_activeGroup'を読み取ることができません。 : –

+0

スニペットは働いているように見えます – AndreaBogazzi

+0

あなたの助けに感謝します。 –

-1

助けてください。ここで

はjsfiddleです:​​グループへ

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(); 
      }); 
関連する問題