@@ -3,6 +3,7 @@ import definition = require("ui/gestures");
3
3
import observable = require( "data/observable" ) ;
4
4
import view = require( "ui/core/view" ) ;
5
5
import trace = require( "trace" ) ;
6
+ import utils = require( "utils/utils" ) ;
6
7
7
8
global . moduleMerge ( common , exports ) ;
8
9
@@ -11,10 +12,11 @@ var SWIPE_VELOCITY_THRESHOLD = 100;
11
12
12
13
export class GesturesObserver extends common . GesturesObserver {
13
14
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 ;
18
20
19
21
private _onTargetLoaded : ( data : observable . EventData ) => void ;
20
22
private _onTargetUnloaded : ( data : observable . EventData ) => void ;
@@ -62,6 +64,7 @@ export class GesturesObserver extends common.GesturesObserver {
62
64
this . _scaleGestureDetector = null ;
63
65
this . _swipeGestureDetector = null ;
64
66
this . _panGestureDetector = null ;
67
+ this . _panGestureListener = null ;
65
68
}
66
69
67
70
private _attach ( target : view . View , type : definition . GestureTypes ) {
@@ -81,7 +84,8 @@ export class GesturesObserver extends common.GesturesObserver {
81
84
}
82
85
83
86
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 ) ;
85
89
}
86
90
}
87
91
@@ -100,6 +104,10 @@ export class GesturesObserver extends common.GesturesObserver {
100
104
101
105
if ( this . _panGestureDetector ) {
102
106
this . _panGestureDetector . onTouchEvent ( motionEvent ) ;
107
+
108
+ if ( motionEvent . getActionMasked ( ) === android . view . MotionEvent . ACTION_UP ) {
109
+ this . _panGestureListener . onTouchUpAction ( motionEvent ) ;
110
+ }
103
111
}
104
112
105
113
if ( this . type & definition . GestureTypes . rotation && motionEvent . getPointerCount ( ) === 2 ) {
@@ -129,7 +137,7 @@ export class GesturesObserver extends common.GesturesObserver {
129
137
}
130
138
}
131
139
132
- function getState ( e : android . view . MotionEvent ) {
140
+ function getState ( e : android . view . MotionEvent ) : common . GestureStateTypes {
133
141
if ( e . getAction ( ) === android . view . MotionEvent . ACTION_DOWN ) {
134
142
return common . GestureStateTypes . began ;
135
143
} else if ( e . getAction ( ) === android . view . MotionEvent . ACTION_CANCEL ) {
@@ -162,11 +170,10 @@ function _getSwipeArgs(direction: definition.SwipeDirection, view: view.View,
162
170
ios : undefined ,
163
171
object : view ,
164
172
eventName : definition . toString ( definition . GestureTypes . swipe ) ,
165
- state : getState ( currentEvent )
166
173
} ;
167
174
}
168
175
169
- function _getPanArgs ( deltaX : number , deltaY : number , view : view . View ,
176
+ function _getPanArgs ( deltaX : number , deltaY : number , view : view . View , state : common . GestureStateTypes ,
170
177
initialEvent : android . view . MotionEvent , currentEvent : android . view . MotionEvent ) : definition . PanGestureEventData {
171
178
return < definition . PanGestureEventData > {
172
179
type : definition . GestureTypes . pan ,
@@ -177,7 +184,7 @@ function _getPanArgs(deltaX: number, deltaY: number, view: view.View,
177
184
ios : undefined ,
178
185
object : view ,
179
186
eventName : definition . toString ( definition . GestureTypes . pan ) ,
180
- state : getState ( currentEvent )
187
+ state : state
181
188
} ;
182
189
}
183
190
@@ -367,12 +374,18 @@ class SwipeGestureListener extends android.view.GestureDetector.SimpleOnGestureL
367
374
class PanGestureListener extends android . view . GestureDetector . SimpleOnGestureListener {
368
375
private _observer : GesturesObserver ;
369
376
private _target : view . View ;
377
+ private _isScrolling : boolean ;
378
+ private _deltaX : number ;
379
+ private _deltaY : number ;
380
+ private _density : number ;
370
381
371
382
constructor ( observer : GesturesObserver , target : view . View ) {
372
383
super ( ) ;
373
384
374
385
this . _observer = observer ;
375
386
this . _target = target ;
387
+ this . _isScrolling = false ;
388
+ this . _density = utils . layout . getDisplayDensity ( ) ;
376
389
377
390
return global . __native ( this ) ;
378
391
}
@@ -382,10 +395,29 @@ class PanGestureListener extends android.view.GestureDetector.SimpleOnGestureLis
382
395
}
383
396
384
397
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 ) ;
388
408
_executeCallback ( this . _observer , args ) ;
389
409
return true ;
390
410
}
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
+ }
391
423
}
0 commit comments