All files / src/eventInput TouchEventInput.ts

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            9x   66x 66x 66x 66x       9x       45x 45x     45x     9x       2522x     2522x     9x 32x 32x     9x 33x 33x 33x     9x 2494x     9x 2431x 1946x   485x           9x 2567x           9x 2431x 2431x           2431x         9x  
/*
 * Copyright (c) 2015 NAVER Corp.
 * egjs projects are licensed under the MIT license
 */
import { InputEventType, ExtendedEvent } from "../types";
 
import { EventInput } from "./EventInput";
 
export class TouchEventInput extends EventInput {
  public readonly start = ["touchstart"];
  public readonly move = ["touchmove"];
  public readonly end = ["touchend", "touchcancel"];
 
  private _baseTouches: TouchList;
 
  public onEventStart(
    event: InputEventType,
    inputKey?: string[]
  ): ExtendedEvent {
    this._baseTouches = (event as TouchEvent).touches;
    Iif (!this._isValidEvent(event, inputKey)) {
      return null;
    }
    return this.extendEvent(event);
  }
 
  public onEventMove(
    event: InputEventType,
    inputKey?: string[]
  ): ExtendedEvent {
    Iif (!this._isValidEvent(event, inputKey)) {
      return null;
    }
    return this.extendEvent(event);
  }
 
  public onEventEnd(event: InputEventType): void {
    this._baseTouches = (event as TouchEvent).touches;
    return;
  }
 
  public onRelease(): void {
    this.prevEvent = null;
    this._baseTouches = null;
    return;
  }
 
  public getTouches(event: InputEventType): number {
    return (event as TouchEvent).touches.length;
  }
 
  protected _getScale(event: TouchEvent): number {
    if (event.touches.length !== 2 || this._baseTouches.length < 2) {
      return null; // TODO: consider calculating non-pinch gesture scale
    }
    return (
      this._getDistance(event.touches[0], event.touches[1]) /
      this._getDistance(this._baseTouches[0], this._baseTouches[1])
    );
  }
 
  protected _getCenter(event: TouchEvent): { x: number; y: number } {
    return {
      x: event.touches[0].clientX,
      y: event.touches[0].clientY,
    };
  }
 
  protected _getMovement(event: TouchEvent): { x: number; y: number } {
    const prev = this.prevEvent.srcEvent as TouchEvent;
    Iif (event.touches[0].identifier !== prev.touches[0].identifier) {
      return {
        x: 0,
        y: 0,
      };
    }
    return {
      x: event.touches[0].clientX - prev.touches[0].clientX,
      y: event.touches[0].clientY - prev.touches[0].clientY,
    };
  }
}