| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- import { ref } from 'vue';
- const MIN_DISTANCE = 10;
- type Direction = '' | 'vertical' | 'horizontal';
- function getDirection(x: number, y: number) {
- if (x > y && x > MIN_DISTANCE) {
- return 'horizontal';
- }
- if (y > x && y > MIN_DISTANCE) {
- return 'vertical';
- }
- return '';
- }
- export function useTouch() {
- const startX = ref(0);
- const startY = ref(0);
- const deltaX = ref(0);
- const deltaY = ref(0);
- const offsetX = ref(0);
- const offsetY = ref(0);
- const direction = ref<Direction>('');
- const isVertical = () => direction.value === 'vertical';
- const isHorizontal = () => direction.value === 'horizontal';
- const reset = () => {
- deltaX.value = 0;
- deltaY.value = 0;
- offsetX.value = 0;
- offsetY.value = 0;
- direction.value = '';
- };
- const start = ((event: TouchEvent) => {
- reset();
- startX.value = event.touches[0].clientX;
- startY.value = event.touches[0].clientY;
- }) as EventListener;
- const move = ((event: TouchEvent) => {
- const touch = event.touches[0];
- deltaX.value = touch.clientX - startX.value;
- deltaY.value = touch.clientY - startY.value;
- offsetX.value = Math.abs(deltaX.value);
- offsetY.value = Math.abs(deltaY.value);
- if (!direction.value) {
- direction.value = getDirection(offsetX.value, offsetY.value);
- }
- }) as EventListener;
- return {
- move,
- start,
- reset,
- startX,
- startY,
- deltaX,
- deltaY,
- offsetX,
- offsetY,
- direction,
- isVertical,
- isHorizontal
- };
- }
|