| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- import { reactive } from 'vue';
- const DISTANCE = 5;
- type Direction = 'horizontal' | 'vertical' | '';
- export function useTouch() {
- const state = reactive({
- startX: 0,
- startY: 0,
- deltaX: 0,
- deltaY: 0,
- offsetX: 0,
- offsetY: 0,
- direction: '' as Direction
- });
- const getDirection = (x: number, y: number) => {
- if (x > y && x > DISTANCE) return 'horizontal';
- if (y > x && y > DISTANCE) return 'vertical';
- return '';
- };
- const reset = () => {
- state.startX = 0;
- state.startY = 0;
- state.deltaX = 0;
- state.deltaY = 0;
- state.offsetX = 0;
- state.offsetY = 0;
- state.direction = '';
- };
- const start = ((e: TouchEvent) => {
- reset();
- state.startX = e.touches[0].clientX;
- state.startY = e.touches[0].clientY;
- }) as EventListener;
- const move = ((e: TouchEvent) => {
- state.deltaX = e.touches[0].clientX - state.startX;
- state.deltaY = e.touches[0].clientY - state.startY;
- state.offsetX = Math.abs(state.deltaX);
- state.offsetY = Math.abs(state.deltaY);
- if (!state.direction) {
- state.direction = getDirection(state.offsetX, state.offsetY);
- }
- }) as EventListener;
- return {
- state,
- start,
- reset,
- move
- };
- }
|