2016-10-14 2 views
1

Когда я использую кнопку для выбора всех объектов, я могу перемещать все в порядке, и все это остается на месте. Однако, если я хочу запустить событие, когда я нажимаю объект на холсте, он не работает должным образом.Объекты перемещают позицию автоматически при попытке выбрать все на mousedown (Fabric.JS)

Адрес: Plnk;

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

Я использую это как фрагмент кода на SelectAll;

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(); 
}) 

Это сделает объекты автоматически прыгающими.

Мне интересно, есть ли способ, которым я могу использовать два предыдущих метода, поэтому функция ведет себя, как при нажатии?

+0

Я думаю, что вы испортили поведение по умолчанию 'mouse: down', переписав его обработчиком. Если вы удалите все остальные обработчики событий мыши из холста и перезапишите «mouse: down» с помощью вашего обработчика, то он будет точно таким же, как ваша кнопка: http://plnkr.co/edit/ouubVzNi3MTl4rXIQOua?p=preview (сначала щелчок выбирает все, второй клик переводит их в '(0, 0)' по любой причине). Я думаю, вы не должны перезаписывать обработчики событий canvas, но, возможно, есть способ их расширения. –

+0

вы хотите переопределить мышь: вниз по объектам холста, в основном то, что происходит, - это щелчок по умолчанию и перетаскивание одного объекта, а ваш клик и выбор всего работает одновременно, это создает странное поведение ваших объектов. –

ответ

2

Если я понимаю это право, я думаю, что некоторое время назад я ответил на довольно похожий вопрос: 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(); 
}); 
+0

Отлично, это хорошо работает для меня! Спасибо за ответ :) – alexc