#konvajs #konva #vue-konva
#конвайс #konva #vue-konva
Вопрос:
Я работал над включением жестов поворота в свое приложение, следуя руководству, приведенному на https://konvajs.org/docs/sandbox/Gestures.html . Но в моем приложении я также подключил прослушиватель событий ‘tap’, поэтому всякий раз, когда я пытался повернуть фигуру с помощью жеста, также генерируется событие ‘tap’, и при записи фигуры на один раз событие ‘tap’ генерируется дважды. Есть ли какой-либо способ, чтобы я мог предотвратить это, означает, что при вращении с помощью жеста поворота 2 пальца событие ‘tap’ не должно генерироваться? есть ли какой-либо способ использовать 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 генерирует 2 события в вашем примере скрипки. Кроме того, демонстрация на целевой странице hammer.js обеспечивает нажатие и поворот, но не с помощью canvas или конвайсов.
Ответ №1:
tap
событие является «родным» событием konva. Это означает Konva
, что поддерживает его по умолчанию. Так 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")
});
Комментарии:
1. В описании демонстрации на konvajs.org/docs/sandbox/Gestures.html вы упоминаете, что использовали модифицированную версию hammer.js — это все еще правда ?
2. @VanquishedWombat да. Изначально это работает на DOM-узлах. Не узлы Konva.