@@ -443,52 +443,77 @@ class PanGestureListener extends android.view.GestureDetector.SimpleOnGestureLis
443
443
class RotateGestureDetector {
444
444
private observer : GesturesObserver ;
445
445
private target : view . View ;
446
- private ptrID1 : number ;
447
- private ptrID2 : number ;
446
+ private trackedPtrId1 : number ;
447
+ private trackedPtrId2 : number ;
448
448
449
449
private initalPointersAngle : number ;
450
450
private angle : number ;
451
451
452
+ private get isTracking ( ) : boolean {
453
+ return this . trackedPtrId1 !== INVALID_POINTER_ID && this . trackedPtrId2 !== INVALID_POINTER_ID ;
454
+ }
455
+
452
456
constructor ( observer : GesturesObserver , target : view . View ) {
453
457
this . observer = observer ;
454
458
this . target = target ;
455
459
456
- this . ptrID1 = INVALID_POINTER_ID ;
457
- this . ptrID2 = INVALID_POINTER_ID ;
460
+ this . trackedPtrId1 = INVALID_POINTER_ID ;
461
+ this . trackedPtrId2 = INVALID_POINTER_ID ;
458
462
}
459
463
460
464
public onTouchEvent ( event : android . view . MotionEvent ) {
465
+ let pointerID = event . getPointerId ( event . getActionIndex ( ) ) ;
466
+ let wasTracking = this . isTracking ;
461
467
462
468
switch ( event . getActionMasked ( ) ) {
463
469
case android . view . MotionEvent . ACTION_DOWN :
464
- this . ptrID1 = event . getPointerId ( event . getActionIndex ( ) ) ;
465
- break ;
466
470
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
+ }
469
480
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
+ }
471
487
break ;
488
+
472
489
case android . view . MotionEvent . ACTION_MOVE :
473
- if ( this . ptrID1 !== INVALID_POINTER_ID && this . ptrID2 !== INVALID_POINTER_ID ) {
490
+ if ( this . isTracking ) {
474
491
this . updateAngle ( event ) ;
475
492
476
493
this . executeCallback ( event , common . GestureStateTypes . changed ) ;
477
494
}
478
495
break ;
496
+
479
497
case android . view . MotionEvent . ACTION_UP :
480
- this . ptrID1 = INVALID_POINTER_ID ;
481
- break ;
482
498
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
+ }
484
505
485
- this . executeCallback ( event , common . GestureStateTypes . ended ) ;
506
+ if ( wasTracking && ! this . isTracking ) {
507
+ this . executeCallback ( event , common . GestureStateTypes . ended ) ;
508
+ }
486
509
break ;
487
- case android . view . MotionEvent . ACTION_CANCEL :
488
- this . ptrID1 = INVALID_POINTER_ID ;
489
- this . ptrID2 = INVALID_POINTER_ID ;
490
510
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
+ }
492
517
break ;
493
518
}
494
519
return true ;
@@ -524,10 +549,10 @@ class RotateGestureDetector {
524
549
}
525
550
526
551
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 ) ) ;
531
556
532
557
return Math . atan2 ( ( secondY - firstY ) , ( secondX - firstX ) ) ;
533
558
}
0 commit comments