Skip to content

Commit e0681bc

Browse files
author
vakrilov
committed
Android: Multi-touch handling in rotate gesture.
1 parent 13907fd commit e0681bc

File tree

1 file changed

+47
-22
lines changed

1 file changed

+47
-22
lines changed

ui/gestures/gestures.android.ts

Lines changed: 47 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -443,52 +443,77 @@ class PanGestureListener extends android.view.GestureDetector.SimpleOnGestureLis
443443
class 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

Comments
 (0)