feat(nds): handle swipes
This commit is contained in:
@@ -195,12 +195,14 @@ useKeyDown(({ key, repeated }) => {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
switch (key) {
|
switch (key) {
|
||||||
|
case "NDS_SWIPE_RIGHT":
|
||||||
case "NDS_LEFT":
|
case "NDS_LEFT":
|
||||||
if (store.currentProject > 0) {
|
if (store.currentProject > 0) {
|
||||||
startButtonAnimation("prev");
|
startButtonAnimation("prev");
|
||||||
store.scrollProjects("left");
|
store.scrollProjects("left");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case "NDS_SWIPE_LEFT":
|
||||||
case "NDS_RIGHT":
|
case "NDS_RIGHT":
|
||||||
if (store.currentProject < store.projects.length - 1) {
|
if (store.currentProject < store.projects.length - 1) {
|
||||||
startButtonAnimation("next");
|
startButtonAnimation("next");
|
||||||
|
|||||||
@@ -69,6 +69,57 @@ const handleCanvasWheel = (event: WheelEvent) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const SWIPE_THRESHOLD = 30;
|
||||||
|
let swipeStartX = 0;
|
||||||
|
let swipeStartY = 0;
|
||||||
|
|
||||||
|
const dispatchSwipe = (endX: number, endY: number) => {
|
||||||
|
const deltaX = endX - swipeStartX;
|
||||||
|
const deltaY = endY - swipeStartY;
|
||||||
|
const absDeltaX = Math.abs(deltaX);
|
||||||
|
const absDeltaY = Math.abs(deltaY);
|
||||||
|
|
||||||
|
if (Math.max(absDeltaX, absDeltaY) < SWIPE_THRESHOLD) return;
|
||||||
|
|
||||||
|
let direction: string;
|
||||||
|
if (absDeltaX > absDeltaY) {
|
||||||
|
direction = deltaX > 0 ? "RIGHT" : "LEFT";
|
||||||
|
} else {
|
||||||
|
direction = deltaY > 0 ? "DOWN" : "UP";
|
||||||
|
}
|
||||||
|
|
||||||
|
window.dispatchEvent(
|
||||||
|
new KeyboardEvent("keydown", { key: `NDS_SWIPE_${direction}` }),
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleTouchStart = (event: TouchEvent) => {
|
||||||
|
const touch = event.touches[0];
|
||||||
|
if (!touch) return;
|
||||||
|
swipeStartX = touch.clientX;
|
||||||
|
swipeStartY = touch.clientY;
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleTouchEnd = (event: TouchEvent) => {
|
||||||
|
const touch = event.changedTouches[0];
|
||||||
|
if (!touch) return;
|
||||||
|
dispatchSwipe(touch.clientX, touch.clientY);
|
||||||
|
};
|
||||||
|
|
||||||
|
let mouseSwiping = false;
|
||||||
|
|
||||||
|
const handleSwipeMouseDown = (event: MouseEvent) => {
|
||||||
|
mouseSwiping = true;
|
||||||
|
swipeStartX = event.clientX;
|
||||||
|
swipeStartY = event.clientY;
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleSwipeMouseUp = (event: MouseEvent) => {
|
||||||
|
if (!mouseSwiping) return;
|
||||||
|
mouseSwiping = false;
|
||||||
|
dispatchSwipe(event.clientX, event.clientY);
|
||||||
|
};
|
||||||
|
|
||||||
const renderFrame = (timestamp: number) => {
|
const renderFrame = (timestamp: number) => {
|
||||||
if (!ctx) return;
|
if (!ctx) return;
|
||||||
|
|
||||||
@@ -122,6 +173,12 @@ onMounted(() => {
|
|||||||
canvas.value.addEventListener("click", handleCanvasClick);
|
canvas.value.addEventListener("click", handleCanvasClick);
|
||||||
canvas.value.addEventListener("mousedown", handleCanvasMouseDown);
|
canvas.value.addEventListener("mousedown", handleCanvasMouseDown);
|
||||||
canvas.value.addEventListener("wheel", handleCanvasWheel, { passive: true });
|
canvas.value.addEventListener("wheel", handleCanvasWheel, { passive: true });
|
||||||
|
canvas.value.addEventListener("touchstart", handleTouchStart, {
|
||||||
|
passive: true,
|
||||||
|
});
|
||||||
|
canvas.value.addEventListener("touchend", handleTouchEnd, { passive: true });
|
||||||
|
canvas.value.addEventListener("mousedown", handleSwipeMouseDown);
|
||||||
|
document.addEventListener("mouseup", handleSwipeMouseUp);
|
||||||
|
|
||||||
animationFrameId = requestAnimationFrame(renderFrame);
|
animationFrameId = requestAnimationFrame(renderFrame);
|
||||||
});
|
});
|
||||||
@@ -135,7 +192,11 @@ onUnmounted(() => {
|
|||||||
canvas.value.removeEventListener("click", handleCanvasClick);
|
canvas.value.removeEventListener("click", handleCanvasClick);
|
||||||
canvas.value.removeEventListener("mousedown", handleCanvasMouseDown);
|
canvas.value.removeEventListener("mousedown", handleCanvasMouseDown);
|
||||||
canvas.value.removeEventListener("wheel", handleCanvasWheel);
|
canvas.value.removeEventListener("wheel", handleCanvasWheel);
|
||||||
|
canvas.value.removeEventListener("touchstart", handleTouchStart);
|
||||||
|
canvas.value.removeEventListener("touchend", handleTouchEnd);
|
||||||
|
canvas.value.removeEventListener("mousedown", handleSwipeMouseDown);
|
||||||
}
|
}
|
||||||
|
document.removeEventListener("mouseup", handleSwipeMouseUp);
|
||||||
});
|
});
|
||||||
|
|
||||||
defineExpose({
|
defineExpose({
|
||||||
|
|||||||
@@ -252,7 +252,7 @@ onRender((ctx) => {
|
|||||||
10,
|
10,
|
||||||
2,
|
2,
|
||||||
118,
|
118,
|
||||||
false,
|
true,
|
||||||
);
|
);
|
||||||
drawButton(
|
drawButton(
|
||||||
ctx,
|
ctx,
|
||||||
@@ -260,7 +260,7 @@ onRender((ctx) => {
|
|||||||
138,
|
138,
|
||||||
2,
|
2,
|
||||||
108,
|
108,
|
||||||
false,
|
true,
|
||||||
);
|
);
|
||||||
}, 110);
|
}, 110);
|
||||||
|
|
||||||
@@ -559,15 +559,19 @@ useKeyDown(({ key }) => {
|
|||||||
];
|
];
|
||||||
break;
|
break;
|
||||||
case "NDS_UP":
|
case "NDS_UP":
|
||||||
|
case "NDS_SWIPE_UP":
|
||||||
slide(-1, 0);
|
slide(-1, 0);
|
||||||
break;
|
break;
|
||||||
case "NDS_DOWN":
|
case "NDS_DOWN":
|
||||||
|
case "NDS_SWIPE_DOWN":
|
||||||
slide(1, 0);
|
slide(1, 0);
|
||||||
break;
|
break;
|
||||||
case "NDS_LEFT":
|
case "NDS_LEFT":
|
||||||
|
case "NDS_SWIPE_LEFT":
|
||||||
slide(0, -1);
|
slide(0, -1);
|
||||||
break;
|
break;
|
||||||
case "NDS_RIGHT":
|
case "NDS_RIGHT":
|
||||||
|
case "NDS_SWIPE_RIGHT":
|
||||||
slide(0, 1);
|
slide(0, 1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -393,7 +393,7 @@ onRender((ctx) => {
|
|||||||
10,
|
10,
|
||||||
2,
|
2,
|
||||||
88,
|
88,
|
||||||
false,
|
true,
|
||||||
);
|
);
|
||||||
drawButton(
|
drawButton(
|
||||||
ctx,
|
ctx,
|
||||||
@@ -401,7 +401,7 @@ onRender((ctx) => {
|
|||||||
108,
|
108,
|
||||||
2,
|
2,
|
||||||
88,
|
88,
|
||||||
false,
|
true,
|
||||||
);
|
);
|
||||||
drawButton(
|
drawButton(
|
||||||
ctx,
|
ctx,
|
||||||
@@ -409,7 +409,7 @@ onRender((ctx) => {
|
|||||||
206,
|
206,
|
||||||
2,
|
2,
|
||||||
40,
|
40,
|
||||||
false,
|
true,
|
||||||
);
|
);
|
||||||
}, 110);
|
}, 110);
|
||||||
|
|
||||||
|
|||||||
@@ -309,15 +309,19 @@ useKeyDown(({ key }) => {
|
|||||||
const newDirection = direction.clone();
|
const newDirection = direction.clone();
|
||||||
switch (key) {
|
switch (key) {
|
||||||
case "NDS_UP":
|
case "NDS_UP":
|
||||||
|
case "NDS_SWIPE_UP":
|
||||||
newDirection.set(0, -1);
|
newDirection.set(0, -1);
|
||||||
break;
|
break;
|
||||||
case "NDS_RIGHT":
|
case "NDS_RIGHT":
|
||||||
|
case "NDS_SWIPE_RIGHT":
|
||||||
newDirection.set(1, 0);
|
newDirection.set(1, 0);
|
||||||
break;
|
break;
|
||||||
case "NDS_DOWN":
|
case "NDS_DOWN":
|
||||||
|
case "NDS_SWIPE_DOWN":
|
||||||
newDirection.set(0, 1);
|
newDirection.set(0, 1);
|
||||||
break;
|
break;
|
||||||
case "NDS_LEFT":
|
case "NDS_LEFT":
|
||||||
|
case "NDS_SWIPE_LEFT":
|
||||||
newDirection.set(-1, 0);
|
newDirection.set(-1, 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user