как прикрепить слушателей событий поворота и касания к фигурам в konvajs?
Я работал над включением жестов поворота в свое приложение, следуя руководству по https://konvajs.org/docs/sandbox/Gestures.html. Но в своем приложении я также прикрепил прослушиватель событий "касания", поэтому всякий раз, когда я пытался повернуть фигуру с помощью жеста, событие "касание" также генерируется, а при записи формы на один раз событие "касания" генерируется дважды. Есть ли способ, чтобы я мог предотвратить это, означает, что при вращении с помощью жеста поворота двумя пальцами событие "касание" не должно генерироваться? есть ли способ использовать stopImmediatePropagation() в konvajs?
group.on('tap', function(ev) {
console.log("tap event")
});
group.on('rotatestart', function(ev) {
oldRotation = ev.evt.gesture.rotation;
startScale = rect.scaleX();
group.stopDrag();
group.draggable(false);
text.text('rotating...');
});
group.on('rotate', function(ev) {
var delta = oldRotation - ev.evt.gesture.rotation;
group.rotate(-delta);
oldRotation = ev.evt.gesture.rotation;
group.scaleX(startScale * ev.evt.gesture.scale);
group.scaleY(startScale * ev.evt.gesture.scale);
layer.batchDraw();
});
group.on('rotateend rotatecancel', function(ev) {
text.text(defaultText);
group.draggable(true);
layer.batchDraw();
});
1 ответ
tap
событие - это "родное" событие конвы. Это означает
Konva
поддерживает его по умолчанию. Так
Konva
ничего не знает о событиях поворота. Даже если вы вращаете фигуру, для конвы все равно кажется, что вы нажимаете на нее (у нее
touchdown
и
touchmove
События).
Но hammerjs обрабатывает такие ситуации автоматически. Поэтому вместо прослушивания событий на узле Konva вы можете прослушивать их в экземпляре Hammertime:
hammertime.on('tap', function(ev) {
console.log("tap event")
});
Демо: https://jsfiddle.net/hj84aLys/
Это также частично исправит двойной
tap
триггерная проблема, упомянутая в комментариях.
Другой обходной путь - просто проверить
tap
событие, если поворот произошел недавно. Если нет - то можно продолжить:
var rotated = false;
group.on('touchstart', function(ev) {
rotated = false;
});
group.on('rotate', function(ev) {
rotated = true;
});
group.on('tap', function(ev) {
// do nothing on rotate.
if (rotated) {
return;
}
console.log("tap event")
});