File size: 3,040 Bytes
3a08226 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | // Gesture Worker - Processes touch gestures off main thread
const GESTURE_THRESHOLD = 50;
const VELOCITY_THRESHOLD = 0.5;
let gestureState = {
startX: 0,
startY: 0,
startTime: 0,
lastX: 0,
lastY: 0,
isTracking: false
};
self.addEventListener('message', (e) => {
const { type, event } = e.data;
switch (type) {
case 'TOUCH_START':
handleTouchStart(event);
break;
case 'TOUCH_MOVE':
handleTouchMove(event);
break;
case 'TOUCH_END':
const gesture = handleTouchEnd(event);
if (gesture) {
self.postMessage({ type: 'GESTURE_DETECTED', gesture });
}
break;
}
});
function handleTouchStart(event) {
gestureState = {
startX: event.x,
startY: event.y,
startTime: event.time,
lastX: event.x,
lastY: event.y,
isTracking: true
};
}
function handleTouchMove(event) {
if (!gestureState.isTracking) return;
gestureState.lastX = event.x;
gestureState.lastY = event.y;
// Calculate current delta for live feedback
const deltaX = event.x - gestureState.startX;
const deltaY = event.y - gestureState.startY;
self.postMessage({
type: 'GESTURE_PROGRESS',
deltaX, deltaY,
progress: Math.min(Math.abs(deltaY) / 300, 1)
});
}
function handleTouchEnd(event) {
if (!gestureState.isTracking) return null;
gestureState.isTracking = false;
const deltaX = event.x - gestureState.startX;
const deltaY = event.y - gestureState.startY;
const deltaTime = event.time - gestureState.startTime;
const velocityX = deltaX / deltaTime;
const velocityY = deltaY / deltaTime;
// Detect gesture type
if (Math.abs(deltaY) > Math.abs(deltaX)) {
// Vertical gesture
if (Math.abs(deltaY) > GESTURE_THRESHOLD && Math.abs(velocityY) > VELOCITY_THRESHOLD) {
if (deltaY < 0) {
return { type: 'SWIPE_UP', velocity: velocityY, distance: Math.abs(deltaY) };
} else {
return { type: 'SWIPE_DOWN', velocity: velocityY, distance: Math.abs(deltaY) };
}
}
// Edge swipe detection
if (gestureState.startY < 50 && deltaY > 100) {
return { type: 'STATUS_PULL' };
}
if (gestureState.startY > (self.innerHeight - 50) && deltaY < -100) {
return { type: 'HOME_GESTURE' };
}
} else {
// Horizontal gesture
if (Math.abs(deltaX) > GESTURE_THRESHOLD && Math.abs(velocityX) > VELOCITY_THRESHOLD) {
if (deltaX < 0) {
return { type: 'SWIPE_LEFT', velocity: velocityX };
} else {
return { type: 'SWIPE_RIGHT', velocity: velocityX };
}
}
// Edge swipe
if (gestureState.startX < 20) {
return { type: 'BACK_GESTURE' };
}
}
// Quick settings from top-right
if (gestureState.startY < 50 && gestureState.startX > self.innerWidth - 100 && deltaY > 50) {
return { type: 'QUICK_SETTINGS' };
}
// Notifications from top-left
if (gestureState.startY < 50 && gestureState.startX < 100 && deltaY > 50) {
return { type: 'NOTIFICATIONS' };
}
return null;
} |