我正在为我的项目使用Fabric JS,我想分割多行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/
任何帮助将不胜感激。提前谢谢。
答案 0 :(得分:1)
最好的方法是从结构中获取任何textLine,它已经拆分,为每一行生成一个新对象,修复顶部值,最后渲染。
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;
答案 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();
});