@@ -4,9 +4,10 @@ import { readMousePosition, readTouchPosition } from '../core/event-readers';
44
55export class BehaviorController {
66 private readonly onMouseMoveHandler = ( e : MouseEvent ) => this . onMouseMove ( e ) ;
7- private readonly onTouchMoveHandler = ( e : TouchEvent ) => this . onTouchMove ( e ) ;
87 private readonly onMouseUpHandler = ( e : MouseEvent ) => this . onMouseUp ( e ) ;
8+ private readonly onTouchMoveHandler = ( e : TouchEvent ) => this . onTouchMove ( e ) ;
99 private readonly onTouchEndHandler = ( e : TouchEvent ) => this . onTouchEnd ( e ) ;
10+ private readonly onTouchStartHandler = ( e : TouchEvent ) => this . onTouchStart ( e ) ;
1011
1112 private state ?: {
1213 startPosition : Vector ;
@@ -15,7 +16,7 @@ export class BehaviorController {
1516
1617 public start ( startPosition : Vector , behavior : Behavior ) {
1718 if ( this . state ) {
18- this . stop ( ) ;
19+ this . stop ( true ) ;
1920 return ;
2021 }
2122
@@ -25,10 +26,11 @@ export class BehaviorController {
2526 } ;
2627 behavior . onStart ( this . state . startPosition ) ;
2728
28- window . addEventListener ( 'mousemove' , this . onMouseMoveHandler ) ;
29- window . addEventListener ( 'touchmove' , this . onTouchMoveHandler ) ;
30- window . addEventListener ( 'mouseup' , this . onMouseUpHandler ) ;
31- window . addEventListener ( 'touchend' , this . onTouchEndHandler ) ;
29+ window . addEventListener ( 'mousemove' , this . onMouseMoveHandler , false ) ;
30+ window . addEventListener ( 'touchmove' , this . onTouchMoveHandler , false ) ;
31+ window . addEventListener ( 'mouseup' , this . onMouseUpHandler , false ) ;
32+ window . addEventListener ( 'touchend' , this . onTouchEndHandler , false ) ;
33+ window . addEventListener ( 'touchstart' , this . onTouchStartHandler , false ) ;
3234 }
3335
3436 private onMouseMove ( e : MouseEvent ) {
@@ -43,12 +45,19 @@ export class BehaviorController {
4345
4446 private onMouseUp ( e : MouseEvent ) {
4547 e . preventDefault ( ) ;
46- this . stop ( ) ;
48+ this . stop ( false ) ;
4749 }
4850
4951 private onTouchEnd ( e : TouchEvent ) {
5052 e . preventDefault ( ) ;
51- this . stop ( ) ;
53+ this . stop ( false ) ;
54+ }
55+
56+ private onTouchStart ( e : TouchEvent ) {
57+ e . preventDefault ( ) ;
58+ if ( e . touches . length !== 1 ) {
59+ this . stop ( true ) ;
60+ }
5261 }
5362
5463 private move ( position : Vector ) {
@@ -60,25 +69,26 @@ export class BehaviorController {
6069
6170 const newBehavior = this . state . behavior . onMove ( delta ) ;
6271 if ( newBehavior ) {
63- this . state . behavior . onEnd ( ) ;
72+ this . state . behavior . onEnd ( true ) ;
6473
6574 this . state . behavior = newBehavior ;
6675 this . state . startPosition = position ;
6776 this . state . behavior . onStart ( this . state . startPosition ) ;
6877 }
6978 }
7079
71- private stop ( ) {
80+ private stop ( interrupt : boolean ) {
7281 if ( ! this . state ) {
7382 throw new Error ( 'State is empty' ) ;
7483 }
7584
76- window . removeEventListener ( 'mousemove' , this . onMouseMoveHandler ) ;
77- window . removeEventListener ( 'touchmove' , this . onTouchMoveHandler ) ;
78- window . removeEventListener ( 'mouseup' , this . onMouseUpHandler ) ;
79- window . removeEventListener ( 'touchend' , this . onTouchEndHandler ) ;
85+ window . removeEventListener ( 'mousemove' , this . onMouseMoveHandler , false ) ;
86+ window . removeEventListener ( 'touchmove' , this . onTouchMoveHandler , false ) ;
87+ window . removeEventListener ( 'mouseup' , this . onMouseUpHandler , false ) ;
88+ window . removeEventListener ( 'touchend' , this . onTouchEndHandler , false ) ;
89+ window . removeEventListener ( 'touchstart' , this . onTouchEndHandler , false ) ;
8090
81- this . state . behavior . onEnd ( ) ;
91+ this . state . behavior . onEnd ( interrupt ) ;
8292 this . state = undefined ;
8393 }
8494}
0 commit comments