在fabricjs

时间:2015-07-30 19:51:34

标签: javascript canvas rotation fabricjs

有没有办法在fabric.js中旋转画布?

我不打算旋转每个元素,这可以轻松实现,而是旋转整个画布,类似于本机canvas元素上canvas.rotate()所实现的方式:

var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
ctx.rotate(20*Math.PI/180);

可以使用getContext()从fabric.js访问canvas元素,但是如果我这样做然后旋转它,那么两个画布中只有一个正在旋转,选择/绘图严重关闭并且绘制/选择/ etc也不再有用了。

我在这里有些不知所措。如果fabric.js目前无法实现这一点,我将在github上创建一张票,但不知怎的感觉应该可能......

[编辑]

在Ian输入后我发现了一些事情,我可以旋转画布并获得一些结果。但是,物体离正确位置很远。但是,这可能是因为,在旋转时,我也在缩放和绝对平移画布(使用canvas.setZoom()和canvas.absolutePan())。我想我会在GitHub上创建一张票,看看开发者的想法。有点困在这里......仅供参考,这里是代码片段:

setAngle: function(angle) {
    var self = this;

    var canvas = self.getFabricCanvas();
    var group = new fabric.Group();
    var origItems = canvas._objects;
    var size = self.getSize();

    group.set({width: size.width, height: size.height, left: size.width / 2, top: size.height / 2, originX: 'center', originY: 'center', centeredRotation: true})

    for (var i = 0; i < origItems.length; i++) {
        group.add(origItems[i]);
    }

    canvas.add(group);
    group.set({angle: (-1 * self.getOldAngle())});
    canvas.renderAll();
    group.set({angle: angle});
    canvas.renderAll();

    items = group._objects;
    group._restoreObjectsState();
    canvas.remove(group);

    for (var i = 0; i < items.length; i++) {
        canvas.add(items[i]);
        canvas.remove(origItems[i]);
    }

    canvas.renderAll();

    self.setOldAngle(angle);
},

如上所述,使用另外两个函数调用此函数:

setPosition: function(left, top) {
    var self = this;

    if (left < 0) {
        left = 0;
    }
    if (top < 0) {
        top = 0;
    }

    var point = new fabric.Point(left, top);
    self.getFabricCanvas().absolutePan(point);
},

setZoom: function(zoom) {
    var self = this;

    self.getFabricCanvas().setZoom(zoom);
},

通过以下代码调用这些函数:

MyClass.setZoom(1);

MyClass.setPosition(left, top);
MyClass.setZoom(zoom);
MyClass.setAngle(angle);

正如你所看到的,我尝试将角度设置为最后,但是当我这样做时,它并没有产生任何影响(至少在视觉上没有区别)。在开始时将缩放设置为1非常重要,否则平移将无法正常工作。

也许有人有想法......

1 个答案:

答案 0 :(得分:-1)

这就是我的操作方式(基于this js fiddle的代码)。

rotate (degrees) {

  let canvasCenter = new fabric.Point(canvas.getWidth() / 2, canvas.getHeight() / 2) // center of canvas
  let radians = fabric.util.degreesToRadians(degrees)

  canvas.getObjects().forEach((obj) => {
      let objectOrigin = new fabric.Point(obj.left, obj.top)
      let new_loc = fabric.util.rotatePoint(objectOrigin, canvasCenter, radians)
      obj.top = new_loc.y
      obj.left = new_loc.x
      obj.angle += degrees //rotate each object by the same angle
      obj.setCoords()
  });

  canvas.renderAll()


},

完成此操作后,我还必须调整画布的背景和大小,以使对象不会脱离画布。