FabricJS 在 canvas 个元素之间交替?

FabricJS Alternating between canvas elements?

假设我有两个 canvas 元素:

<canvas id="c1" width="400" height="300"></canvas>
<canvas id="c2" width="400" height="300"></canvas>
<canvas id="c3" width="400" height="300"></canvas>

通过查看文档,它告诉我可以使用它来将 canvas 转换为 FabricJS canvas.

var c = new fabric.Canvas('c1', {
    preserveObjectStacking: true,
    isDrawingMode: false
});

现在,如果我想用这个新的 canvas 做点什么,例如添加一个圆圈,我可以使用这个函数:

function AddCircle() {
  var object = new fabric.Circle({
      radius: 15,
      fill: 'blue',
      left: 100,
      top: 100
  });
  c.add(object);
}

现在,这对 c1 来说一切都很好,但是 c2c3 不会做任何事情,因为它从未被初始化。那么是否可以在 FabricJS canvas 元素之间交替?

我希望功能类似于 activeCanvas.add(object) 而不仅仅是 c.add(object)

在您回复之前,请注意我很清楚我可以对 c2 元素使用相同的方法,但我想在 canvas 元素之间切换,而不是我有一些计划。

我不完全确定 canvas 元素之间交替的意思,但这是我的建议。

首先初始化所有canvases:

var options = { preserveObjectStacking: true, isDrawingMode: false };
var c1 = new fabric.Canvas('c1', options),
    c2 = new fabric.Canvas('c2', options),
    c3 = new fabric.Canvas('c3', options);

在执行 Fabric 操作时引用适当的 canvas:

c1.add(object1);
c2.add(object2);
c3.add(object3);

FabricJS 在处理多个 canvases 时没有内置的 activeCanvas 变量,但您可以使用事件来实现。

//declare global activeCanvas variable and allCanvas array
var activeCanvas,
    allCanvas = [c1,c2,c3];

//create function for updating activeCanvas variable
function setActiveCanvas(canvas) {
   activeCanvas = canvas;
}

//adds event to each canvas to update the activeCanvas variable when the mouse enters any canvas
allCanvas.forEach(function(item,index){
    item.on('mouse:over', setActiveCanvas(this));
});

现在您的 activeCanvas 变量将始终引用您鼠标最后输入的 canvas。显然,如果您想支持触摸设备,使用 mouse:over 事件将不起作用,因此您可能需要选择最适合您的项目的 another event

现在您可以修改 AddCircle() 函数以引用 activeCanvas。

function AddCircle() {
  var object = new fabric.Circle({
      radius: 15,
      fill: 'blue',
      left: 100,
      top: 100
  });
  activeCanvas.add(object);
}

的回答是一个很棒的解释,我建议您阅读它,但我想以他所说的一件事为基础。您可以像这样初始化它们:

var options = { preserveObjectStacking: true, isDrawingMode: false };
var c1 = new fabric.Canvas('c1', options),
    c2 = new fabric.Canvas('c2', options),
    c3 = new fabric.Canvas('c3', options),
    allCanvas = [c1, c2, c3];

现在您可以全部或单独修改它们。如果你想同时修改它们,你可以这样做:

allCanvas.forEach(function(item,index){
      var myCircle = new fabric.Circle({
          radius: 15,
          fill: 'blue',
          left: 100,
          top: 100
      });
      item.add(myCircle);
});

当然,您仍然可以按照的精彩解释单独修改它们:

c1.add(object1);
c2.add(object2);
c3.add(object3);