【问题标题】:Objects move position automatically when trying to select all on mousedown (Fabric.JS)尝试在 mousedown 上全选时对象自动移动位置(Fabric.JS)
【发布时间】:2016-10-18 09:11:04
【问题描述】:

当我使用按钮选择所有对象时,我可以很好地移动所有对象,并且它们都保持在原位。但是,如果我想在单击画布上的对象时触发该事件,则它不会按预期工作。

这是一个Plnk;

http://plnkr.co/edit/iqn5QpBRe30eftoI1z8p?p=preview

我用这个作为代码的 sn-p 来选择全部;

function selectAllCanvasObjects(){
var objs = canvas.getObjects().map(function(o) {
  return o.set('active', true);
});

var group = new fabric.Group(objs, {
  originX: 'center', 
  originY: 'center'
});

canvas._activeObject = null;

canvas.setActiveGroup(group.setCoords()).renderAll();

}

当我通过单击按钮激活它时,我可以移动画布上的所有对象,而且它们也不会在单击时移动位置。

如果我通过以下方式激活它;

triangle.on('mousedown', function(e){
  selectAllCanvasObjects();
})

它不会立即初始化移动所有对象。

如果我使用;

canvas.on('mouse:down', function(e){
  selectAllCanvasObjects();
})

它会让物体自动跳转位置。

我想知道是否有一种方法可以使用前面的两种方法,以便函数在单击时表现得像?

【问题讨论】:

  • 我认为您通过使用处理程序覆盖 mouse:down 的默认行为来搞乱它。如果您从画布中删除所有其他鼠标事件处理程序并用您的处理程序覆盖mouse:down,那么它的作用与您的按钮完全相同:plnkr.co/edit/ouubVzNi3MTl4rXIQOua?p=preview(第一次单击全选,第二次单击将它们移动到(0, 0)原因)。我认为您不应该覆盖画布事件处理程序,但也许有一种方法可以扩展它们。
  • 您想覆盖鼠标:在画布对象上按下,基本上发生的是默认单击并拖动单个对象,并且您的单击和全选同时工作,这会产生奇怪的对象的行为

标签: javascript canvas html5-canvas fabricjs


【解决方案1】:

如果我理解这一点,我想我不久前回答了一个非常相似的问题:Fabricjs - how do I deselect an object and select a group without releasing the mouse button

我为此修改了您的 Plunkr(下面的示例代码):http://plnkr.co/edit/5FN5HYWNjU5I3sZO9ixI?p=preview。希望这对您有所帮助。

triangle.on('mousedown', function(evt) {
  canvas.deactivateAll();
  var objs = canvas.getObjects();

  var group = new fabric.Group(objs, {
    status: 'moving'
  });
  // Relevant code
  var originalX = triangle.left,
    originalY = triangle.top,
    mouseX = evt.e.pageX,
    mouseY = evt.e.pageY;

  triangle.on('moving', function(evt) {
    triangle.left = originalX;
    triangle.top = originalY;
    group.left += evt.e.pageX - mouseX;
    group.top += evt.e.pageY - mouseY;
    originalX = triangle.left;
    originalY = triangle.top;
    mouseX = evt.e.pageX;
    mouseY = evt.e.pageY;
  });

  triangle.on('mouseup', function() {
    triangle.off('moving');
  })

  canvas.setActiveGroup(group.setCoords()).renderAll();
});

【讨论】:

  • 太好了,对我来说效果很好!谢谢你的回答:)
猜你喜欢
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
  • 2017-01-02
  • 2023-03-08
相关资源
最近更新 更多