Skip to content

Commit d9ffd87

Browse files
author
vakrilov
committed
Fix pan gesture state in android
1 parent 95f7061 commit d9ffd87

File tree

4 files changed

+46
-15
lines changed

4 files changed

+46
-15
lines changed

apps/ui-tests-app/pages/gestures.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ export function createPage() {
8585
var observer3 = longpressLabel.getGestureObservers(gestures.GestureTypes.longPress)[0];
8686

8787
swipeLabel.on(gestures.GestureTypes.swipe, function (args: gestures.SwipeGestureEventData) {
88-
swipeLabel.text = "Swipe Direction: " + args.direction + ", " + (args.object === swipeLabel) + getStateAsString(args.state);
88+
swipeLabel.text = "Swipe Direction: " + args.direction + ", " + (args.object === swipeLabel);// + getStateAsString(args.state);
8989
});
9090

9191
var observer4 = swipeLabel.getGestureObservers(gestures.GestureTypes.swipe)[0];

ui/gestures/gestures.android.ts

Lines changed: 44 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import definition = require("ui/gestures");
33
import observable = require("data/observable");
44
import view = require("ui/core/view");
55
import trace = require("trace");
6+
import utils = require("utils/utils");
67

78
global.moduleMerge(common, exports);
89

@@ -11,10 +12,11 @@ var SWIPE_VELOCITY_THRESHOLD = 100;
1112

1213
export class GesturesObserver extends common.GesturesObserver {
1314
private _onTouchListener: android.view.View.OnTouchListener;
14-
public _simpleGestureDetector: android.view.GestureDetector;
15-
public _scaleGestureDetector: android.view.ScaleGestureDetector;
16-
public _swipeGestureDetector: android.view.GestureDetector;
17-
public _panGestureDetector: android.view.GestureDetector
15+
private _simpleGestureDetector: android.view.GestureDetector;
16+
private _scaleGestureDetector: android.view.ScaleGestureDetector;
17+
private _swipeGestureDetector: android.view.GestureDetector;
18+
private _panGestureDetector: android.view.GestureDetector
19+
private _panGestureListener: PanGestureListener;
1820

1921
private _onTargetLoaded: (data: observable.EventData) => void;
2022
private _onTargetUnloaded: (data: observable.EventData) => void;
@@ -62,6 +64,7 @@ export class GesturesObserver extends common.GesturesObserver {
6264
this._scaleGestureDetector = null;
6365
this._swipeGestureDetector = null;
6466
this._panGestureDetector = null;
67+
this._panGestureListener = null;
6568
}
6669

6770
private _attach(target: view.View, type: definition.GestureTypes) {
@@ -81,7 +84,8 @@ export class GesturesObserver extends common.GesturesObserver {
8184
}
8285

8386
if (type & definition.GestureTypes.pan) {
84-
this._panGestureDetector = new android.support.v4.view.GestureDetectorCompat(target._context, new PanGestureListener(this, this.target));
87+
this._panGestureListener = new PanGestureListener(this, this.target);
88+
this._panGestureDetector = new android.support.v4.view.GestureDetectorCompat(target._context, this._panGestureListener);
8589
}
8690
}
8791

@@ -100,6 +104,10 @@ export class GesturesObserver extends common.GesturesObserver {
100104

101105
if (this._panGestureDetector) {
102106
this._panGestureDetector.onTouchEvent(motionEvent);
107+
108+
if (motionEvent.getActionMasked() === android.view.MotionEvent.ACTION_UP) {
109+
this._panGestureListener.onTouchUpAction(motionEvent);
110+
}
103111
}
104112

105113
if (this.type & definition.GestureTypes.rotation && motionEvent.getPointerCount() === 2) {
@@ -129,7 +137,7 @@ export class GesturesObserver extends common.GesturesObserver {
129137
}
130138
}
131139

132-
function getState(e: android.view.MotionEvent) {
140+
function getState(e: android.view.MotionEvent): common.GestureStateTypes {
133141
if (e.getAction() === android.view.MotionEvent.ACTION_DOWN) {
134142
return common.GestureStateTypes.began;
135143
} else if (e.getAction() === android.view.MotionEvent.ACTION_CANCEL) {
@@ -162,11 +170,10 @@ function _getSwipeArgs(direction: definition.SwipeDirection, view: view.View,
162170
ios: undefined,
163171
object: view,
164172
eventName: definition.toString(definition.GestureTypes.swipe),
165-
state: getState(currentEvent)
166173
};
167174
}
168175

169-
function _getPanArgs(deltaX: number, deltaY: number, view: view.View,
176+
function _getPanArgs(deltaX: number, deltaY: number, view: view.View, state: common.GestureStateTypes,
170177
initialEvent: android.view.MotionEvent, currentEvent: android.view.MotionEvent): definition.PanGestureEventData {
171178
return <definition.PanGestureEventData>{
172179
type: definition.GestureTypes.pan,
@@ -177,7 +184,7 @@ function _getPanArgs(deltaX: number, deltaY: number, view: view.View,
177184
ios: undefined,
178185
object: view,
179186
eventName: definition.toString(definition.GestureTypes.pan),
180-
state: getState(currentEvent)
187+
state: state
181188
};
182189
}
183190

@@ -367,12 +374,18 @@ class SwipeGestureListener extends android.view.GestureDetector.SimpleOnGestureL
367374
class PanGestureListener extends android.view.GestureDetector.SimpleOnGestureListener {
368375
private _observer: GesturesObserver;
369376
private _target: view.View;
377+
private _isScrolling: boolean;
378+
private _deltaX: number;
379+
private _deltaY: number;
380+
private _density: number;
370381

371382
constructor(observer: GesturesObserver, target: view.View) {
372383
super();
373384

374385
this._observer = observer;
375386
this._target = target;
387+
this._isScrolling = false;
388+
this._density = utils.layout.getDisplayDensity();
376389

377390
return global.__native(this);
378391
}
@@ -382,10 +395,29 @@ class PanGestureListener extends android.view.GestureDetector.SimpleOnGestureLis
382395
}
383396

384397
public onScroll(initialEvent: android.view.MotionEvent, currentEvent: android.view.MotionEvent, lastDeltaX: number, lastDeltaY: number): boolean {
385-
var deltaX = currentEvent.getX() - initialEvent.getX();
386-
var deltaY = currentEvent.getY() - initialEvent.getY();
387-
var args = _getPanArgs(deltaX, deltaY, this._target, initialEvent, currentEvent);
398+
this._deltaX = (currentEvent.getX() - initialEvent.getX()) / this._density;
399+
this._deltaY = (currentEvent.getY() - initialEvent.getY()) / this._density;
400+
401+
if (!this._isScrolling) {
402+
let args = _getPanArgs(this._deltaX, this._deltaY, this._target, common.GestureStateTypes.began, initialEvent, currentEvent);
403+
_executeCallback(this._observer, args);
404+
this._isScrolling = true;
405+
}
406+
407+
let args = _getPanArgs(this._deltaX, this._deltaY, this._target, common.GestureStateTypes.changed, initialEvent, currentEvent);
388408
_executeCallback(this._observer, args);
389409
return true;
390410
}
411+
412+
public onTouchUpAction(currentEvent: android.view.MotionEvent) {
413+
if (!this._isScrolling) {
414+
return;
415+
}
416+
417+
var args = _getPanArgs(this._deltaX, this._deltaY, this._target, common.GestureStateTypes.ended, null, currentEvent);
418+
_executeCallback(this._observer, args);
419+
this._isScrolling = false;
420+
this._deltaX = undefined;
421+
this._deltaY = undefined;
422+
}
391423
}

ui/gestures/gestures.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ declare module "ui/gestures" {
122122
/**
123123
* Provides gesture event data for swipe gesture.
124124
*/
125-
export interface SwipeGestureEventData extends GestureEventDataWithState {
125+
export interface SwipeGestureEventData extends GestureEventData {
126126
direction: SwipeDirection;
127127
}
128128

ui/gestures/gestures.ios.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,6 @@ function _getSwipeData(args: definition.GestureEventData): definition.SwipeGestu
286286
direction: _getSwipeDirection(recognizer.direction),
287287
object: args.view,
288288
eventName: definition.toString(args.type),
289-
state: getState(recognizer)
290289
};
291290
}
292291

0 commit comments

Comments
 (0)