克隆Fabric.js中的对象

Ben*_*ick 11 html5-canvas fabricjs

我使用一个简单的函数克隆Fabric.js中画布上的选定对象.

function duplicateObj() {
  var obj = canvas.getActiveObject();
  var clone = fabric.util.object.clone(obj);
  clone.set({left: 100,top: 100});
  canvas.add(clone); 
}
Run Code Online (Sandbox Code Playgroud)

这非常好.现在,如果我使用该对象并且不再需要克隆并且我选择并删除它,则删除对象,克隆和原始对象.删除功能是:

function deleteObj() {
  var obj = canvas.getActiveObject();
  canvas.fxRemove(obj);
}
Run Code Online (Sandbox Code Playgroud)

对象是一样的.是否有方法克隆对象并使克隆独立于原始对象?我试过这个:

function duplicateObj() {
  var obj = canvas.getActiveObject();
  var clone = fabric.util.object.clone(obj);
  clone.initialize();
  $.extend(clone, obj);
  fabric.util.object.extend(clone, obj);
  clone.set({left: 100,top: 100});
  canvas.add(clone); 
}
Run Code Online (Sandbox Code Playgroud)

它工作,但是对象再次相同,如果我只使用初始化,我最终得到一个现在已设置属性的对象.

swa*_*dhi 13

这是解决方案

 var object = fabric.util.object.clone(canvas.getActiveObject());
    object.set("top", object.top+5);
    object.set("left", object.left+5);
     canvas.add(object);
Run Code Online (Sandbox Code Playgroud)

  • 这个答案有误导性!`fabric.util.object.clone` 并不用于克隆 Fabric 对象,您可以在这里查看 https://github.com/fabricjs/fabric.js/blob/master/src/util/lang_object.js 使用克隆相反,使用 `Object` 方法 - http://fabricjs.com/docs/fabric.Object.html#clone (2认同)

小智 7

这对我来说非常有效,并且克隆的对象与原始对象完全没有链接:

var object = canvas.getActiveObject();

object.clone(function(clone) {
    canvas.add(clone.set({
        left: object.left + 10, 
        top: object.top + 10
    }));
});
Run Code Online (Sandbox Code Playgroud)

您可以克隆所有选定的对象:

var activeObjects = canvas.getActiveObjects();

if (activeObjects) {
    activeObjects.forEach(function(object) {

        object.clone(function(clone) {
            canvas.add(clone.set({
                left: object.left + 10, 
                top: object.top + 10
            }));
        })

    });
}
Run Code Online (Sandbox Code Playgroud)

我希望它可以帮助你!