【问题标题】:Fabric JS: How to shift inverse scaled group relative to background image on html5 canvasFabric JS:如何在 html5 画布上相对于背景图像移动反向缩放组
【发布时间】:2018-09-28 19:49:30
【问题描述】:

我正在做一个项目,其中一个组在缩放事件中被反向缩放。我想出了如何重新定位组以在缩放时保持它相对于背景图像的位置。我的问题是,缩放后,组的对象按预期调整了大小,但正因为如此,三角形底部顶点(看小提琴示例,它会有意义)现在从其原始位置移动。

这是一个缩放演示:https://jsfiddle.net/Xyzor/3mh6g3jg

计算组偏移量的缩放函数

function zoom(factor) {
  var beforeW = 0,
    beforeH = 0;
  factor += c.getZoom();

  c.setZoom(factor)
    .setWidth(500 * factor)
    .setHeight(500 * factor);

  c.forEachObject(function(obj) {
    beforeW = obj.getWidth();
    beforeH = obj.getHeight();

    obj.setScaleX(1 / factor)
      .setScaleY(1 / factor)
      .setLeft(obj.getLeft() + beforeW - obj.getWidth())
      .setTop(obj.getTop() + beforeH - obj.getHeight())
      .setCoords();
  });
  c.renderAll();
}

我尝试的是在缩放之前计算三角形底部顶点与组边界矩形右侧之间的距离。我在缩放后也这样做了,并用这两个值的差异移动了组。我以相同的方式计算了垂直偏移量(使用边界矩形的底部),但它不起作用(这只是偏移量的放大)。我不确定我是否使用了三角形对象的正确坐标。

预期结果: 缩放后,三角形的下顶点保持其相对于背景图像的位置(在上面的示例中,它意味着保持在原点上)。

当前结果: 缩放后,由于缩放,三角形的底部顶点指向背景图像上的不同位置。

感谢您的帮助。

【问题讨论】:

    标签: javascript html5-canvas fabricjs


    【解决方案1】:

    这是最简单的解决方案:

    像这样设置你的组的来源:

    var group = new fabric.Group(
      [circle, triangle, text], {
        left: left,
        top: top,
        type: 'group',
        hasControls: false,
        hasBorders: true,
        borderColor: 'blue',
        originX:'center',
        originY:'bottom'
    };
    

    然后像这样在缩放功能中简单地缩放组:

    var groupScale = 1/factor;
    group.setScaleX(groupScale).setScaleY(groupScale);
    
    c.renderAll();
    

    请看这里:https://jsfiddle.net/3mh6g3jg/9/

    【讨论】:

    • 感谢您的帮助,但我的解释似乎不清楚。在小提琴中,这只是一个示例,该组可以放置在画布上的任何位置。
    • 对,我的解释也不清楚:-)。查看我更新的答案,您可以在任何地方定位。希望对您有所帮助。
    • 我试过你的解决方案(见这里:jsfiddle.net/Xyzor/3mh6g3jg/6)。为了简单起见,我将组的原始位置设置为originalPositionX = canvasWidth / 2 - groupWidth/2originalPositionY = canvasHeight / 2 - groupHeight。即使这样,放大后该组的位置仍然很差。另外,我的主要问题是确定三角形尖端的(originalPositionX,originalPositionY) 位置,无论它在画布上的什么位置。
    • 对,对不起,我的小提琴中有一个错误。看起来您需要先应用比例,然后获得正确的组宽度和高度。我更新了小提琴,现在似乎可以正常工作了。
    • 另外,使用 setLeft() 等设置器时无需调用 setCoords()。
    猜你喜欢
    • 1970-01-01
    • 2018-03-20
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多