diff --git a/src/views/arm/MechanicalArm.vue b/src/views/arm/MechanicalArm.vue index 818bdda..bbba985 100644 --- a/src/views/arm/MechanicalArm.vue +++ b/src/views/arm/MechanicalArm.vue @@ -50,14 +50,14 @@ @@ -94,14 +94,14 @@
前后平移
- + - + @@ -116,14 +116,14 @@
左右平移
- + - + @@ -138,14 +138,14 @@
上下平移
- + - + @@ -170,14 +170,14 @@
前后平移
- + - + @@ -192,14 +192,14 @@
左右平移
- + - + @@ -214,14 +214,14 @@
上下平移
- + - + @@ -410,8 +410,37 @@ const stop = async () => { }) } +const activePointerIds = new Set() + +const startPointerControl = (event, action) => { + if (event.pointerType === 'mouse' && event.button !== 0) return + + event.preventDefault() + activePointerIds.add(event.pointerId) + event.currentTarget?.setPointerCapture?.(event.pointerId) + action() +} + +const endPointerControl = (event) => { + event.preventDefault() + if (!activePointerIds.has(event.pointerId)) return + + activePointerIds.delete(event.pointerId) + if (event.currentTarget?.hasPointerCapture?.(event.pointerId)) { + event.currentTarget.releasePointerCapture(event.pointerId) + } + stop() +} + +const stopActiveControls = () => { + if (!activePointerIds.size) return + activePointerIds.clear() + stop() +} + const timer = ref(null) onMounted(() => { + window.addEventListener('blur', stopActiveControls) nextTick(() => { jointControls.value = urdfViewerRef.value.jointControls torqueOn() @@ -427,6 +456,8 @@ onMounted(() => { }) onUnmounted(() => { + window.removeEventListener('blur', stopActiveControls) + stopActiveControls() if (timer.value) { clearInterval(timer.value) } @@ -443,6 +474,12 @@ onUnmounted(() => { overflow: hidden; user-select: none; + .press-control { + touch-action: none; + -webkit-user-select: none; + user-select: none; + } + // 主体三栏布局 .main-wrap { width: 100%; diff --git a/src/views/chassis/Chassis.vue b/src/views/chassis/Chassis.vue index 74bbc96..ececd0d 100644 --- a/src/views/chassis/Chassis.vue +++ b/src/views/chassis/Chassis.vue @@ -41,15 +41,15 @@
@@ -57,15 +57,15 @@
@@ -200,6 +200,43 @@ function onRelease() { }) } +const activePointerIds = new Set() + +const onPointerDown = (event, direction) => { + if (event.pointerType === 'mouse' && event.button !== 0) return + + event.preventDefault() + activePointerIds.add(event.pointerId) + event.currentTarget?.setPointerCapture?.(event.pointerId) + onPress(direction) +} + +const onPointerEnd = (event) => { + event.preventDefault() + if (!activePointerIds.has(event.pointerId)) return + + activePointerIds.delete(event.pointerId) + if (event.currentTarget?.hasPointerCapture?.(event.pointerId)) { + event.currentTarget.releasePointerCapture(event.pointerId) + } + onRelease() +} + +const releaseActivePointers = () => { + if (!activePointerIds.size) return + activePointerIds.clear() + onRelease() +} + +onMounted(() => { + window.addEventListener('blur', releaseActivePointers) +}) + +onBeforeUnmount(() => { + window.removeEventListener('blur', releaseActivePointers) + releaseActivePointers() +}) +