@@ -443,52 +443,77 @@ class PanGestureListener extends android.view.GestureDetector.SimpleOnGestureLis
443443class RotateGestureDetector {
444444 private observer : GesturesObserver ;
445445 private target : view . View ;
446- private ptrID1 : number ;
447- private ptrID2 : number ;
446+ private trackedPtrId1 : number ;
447+ private trackedPtrId2 : number ;
448448
449449 private initalPointersAngle : number ;
450450 private angle : number ;
451451
452+ private get isTracking ( ) : boolean {
453+ return this . trackedPtrId1 !== INVALID_POINTER_ID && this . trackedPtrId2 !== INVALID_POINTER_ID ;
454+ }
455+
452456 constructor ( observer : GesturesObserver , target : view . View ) {
453457 this . observer = observer ;
454458 this . target = target ;
455459
456- this . ptrID1 = INVALID_POINTER_ID ;
457- this . ptrID2 = INVALID_POINTER_ID ;
460+ this . trackedPtrId1 = INVALID_POINTER_ID ;
461+ this . trackedPtrId2 = INVALID_POINTER_ID ;
458462 }
459463
460464 public onTouchEvent ( event : android . view . MotionEvent ) {
465+ let pointerID = event . getPointerId ( event . getActionIndex ( ) ) ;
466+ let wasTracking = this . isTracking ;
461467
462468 switch ( event . getActionMasked ( ) ) {
463469 case android . view . MotionEvent . ACTION_DOWN :
464- this . ptrID1 = event . getPointerId ( event . getActionIndex ( ) ) ;
465- break ;
466470 case android . view . MotionEvent . ACTION_POINTER_DOWN :
467- this . ptrID2 = event . getPointerId ( event . getActionIndex ( ) ) ;
468- this . initalPointersAngle = this . getPointersAngle ( event ) ;
471+ let assigned = false ;
472+ if ( this . trackedPtrId1 === INVALID_POINTER_ID && pointerID !== this . trackedPtrId2 ) {
473+ this . trackedPtrId1 = pointerID ;
474+ assigned = true ;
475+ }
476+ else if ( this . trackedPtrId2 === INVALID_POINTER_ID && pointerID !== this . trackedPtrId1 ) {
477+ this . trackedPtrId2 = pointerID ;
478+ assigned = true ;
479+ }
469480
470- this . executeCallback ( event , common . GestureStateTypes . began ) ;
481+ if ( assigned && this . isTracking ) {
482+ // We have started tracking 2 pointers
483+ this . angle = 0 ;
484+ this . initalPointersAngle = this . getPointersAngle ( event ) ;
485+ this . executeCallback ( event , common . GestureStateTypes . began ) ;
486+ }
471487 break ;
488+
472489 case android . view . MotionEvent . ACTION_MOVE :
473- if ( this . ptrID1 !== INVALID_POINTER_ID && this . ptrID2 !== INVALID_POINTER_ID ) {
490+ if ( this . isTracking ) {
474491 this . updateAngle ( event ) ;
475492
476493 this . executeCallback ( event , common . GestureStateTypes . changed ) ;
477494 }
478495 break ;
496+
479497 case android . view . MotionEvent . ACTION_UP :
480- this . ptrID1 = INVALID_POINTER_ID ;
481- break ;
482498 case android . view . MotionEvent . ACTION_POINTER_UP :
483- this . ptrID2 = INVALID_POINTER_ID ;
499+ if ( pointerID === this . trackedPtrId1 ) {
500+ this . trackedPtrId1 = INVALID_POINTER_ID ;
501+ }
502+ else if ( pointerID === this . trackedPtrId2 ) {
503+ this . trackedPtrId2 = INVALID_POINTER_ID ;
504+ }
484505
485- this . executeCallback ( event , common . GestureStateTypes . ended ) ;
506+ if ( wasTracking && ! this . isTracking ) {
507+ this . executeCallback ( event , common . GestureStateTypes . ended ) ;
508+ }
486509 break ;
487- case android . view . MotionEvent . ACTION_CANCEL :
488- this . ptrID1 = INVALID_POINTER_ID ;
489- this . ptrID2 = INVALID_POINTER_ID ;
490510
491- this . executeCallback ( event , common . GestureStateTypes . cancelled ) ;
511+ case android . view . MotionEvent . ACTION_CANCEL :
512+ this . trackedPtrId1 = INVALID_POINTER_ID ;
513+ this . trackedPtrId2 = INVALID_POINTER_ID ;
514+ if ( wasTracking ) {
515+ this . executeCallback ( event , common . GestureStateTypes . cancelled ) ;
516+ }
492517 break ;
493518 }
494519 return true ;
@@ -524,10 +549,10 @@ class RotateGestureDetector {
524549 }
525550
526551 private getPointersAngle ( event : android . view . MotionEvent ) {
527- let firstX = event . getX ( event . findPointerIndex ( this . ptrID1 ) ) ;
528- let firstY = event . getY ( event . findPointerIndex ( this . ptrID1 ) ) ;
529- let secondX = event . getX ( event . findPointerIndex ( this . ptrID2 ) ) ;
530- let secondY = event . getY ( event . findPointerIndex ( this . ptrID2 ) ) ;
552+ let firstX = event . getX ( event . findPointerIndex ( this . trackedPtrId1 ) ) ;
553+ let firstY = event . getY ( event . findPointerIndex ( this . trackedPtrId1 ) ) ;
554+ let secondX = event . getX ( event . findPointerIndex ( this . trackedPtrId2 ) ) ;
555+ let secondY = event . getY ( event . findPointerIndex ( this . trackedPtrId2 ) ) ;
531556
532557 return Math . atan2 ( ( secondY - firstY ) , ( secondX - firstX ) ) ;
533558 }
0 commit comments