11import { EventData , View } from '@nativescript/core' ;
2- import { GestureEventData , GestureTypes , GesturesObserver as NGesturesObserver , TouchAction , toString as gestureToString } from '@nativescript/core/ui/gestures' ;
2+ import { GestureEventData , GestureStateTypes , GestureTypes , GesturesObserver as NGesturesObserver , SwipeDirection , TouchAction , toString as gestureToString } from '@nativescript/core/ui/gestures' ;
33import { layout } from '@nativescript/core/utils/utils' ;
44import { Manager } from './gesturehandler' ;
5- import { GestureHandlerStateEvent , GestureHandlerTouchEvent , GestureState , GestureStateEventData , HandlerType } from './gesturehandler.common' ;
5+ import { GestureHandlerStateEvent , GestureHandlerTouchEvent , GestureState , GestureStateEventData , HandlerType , ROOT_GESTURE_HANDLER_TAG } from './gesturehandler.common' ;
66
77export function observe ( target : View , type : GestureTypes , callback : ( args : GestureEventData ) => void , context ?: any ) : GesturesObserver {
88 const observer = new GesturesObserver ( target , callback , context ) ;
@@ -47,6 +47,12 @@ export class GesturesObserver {
4747 if ( ! target [ 'DOUBLE_TAP_HANDLER_TAG' ] ) {
4848 target [ 'DOUBLE_TAP_HANDLER_TAG' ] = TAG ++ ;
4949 }
50+ if ( ! target [ 'PINCH_HANDLER_TAG' ] ) {
51+ target [ 'PINCH_HANDLER_TAG' ] = TAG ++ ;
52+ }
53+ if ( ! target [ 'PAN_HANDLER_TAG' ] ) {
54+ target [ 'PAN_HANDLER_TAG' ] = TAG ++ ;
55+ }
5056 this . _callback = callback ;
5157 this . _context = context ;
5258 }
@@ -88,7 +94,7 @@ export class GesturesObserver {
8894 }
8995 private _notifyTouch : boolean ;
9096
91- private _eventData : TouchGestureEventData ;
97+ private _eventData : { [ k : number ] : CommonGestureEventData | TouchGestureEventData } = { } ;
9298
9399 private _onTargetLoaded : ( data : EventData ) => void ;
94100 private _onTargetUnloaded : ( data : EventData ) => void ;
@@ -116,32 +122,49 @@ export class GesturesObserver {
116122 this . _notifyTouch = false ;
117123 this . _eventData = null ;
118124 }
125+
126+ private emitEvent ( type : GestureTypes , event : GestureStateEventData ) {
127+ if ( this . callback ) {
128+ let eventData = this . _eventData [ type ] as CommonGestureEventData ;
129+ if ( ! eventData ) {
130+ switch ( type ) {
131+ case GestureTypes . pan :
132+ this . _eventData [ type ] = eventData = new PanGestureEventData ( type ) ;
133+ break ;
134+ case GestureTypes . pinch :
135+ this . _eventData [ type ] = eventData = new PinchGestureEventData ( type ) ;
136+ break ;
137+ case GestureTypes . swipe :
138+ this . _eventData [ type ] = eventData = new SwipeGestureEventData ( type ) ;
139+ break ;
140+ default :
141+ this . _eventData [ type ] = eventData = new CommonGestureEventData ( type ) ;
142+ break ;
143+ }
144+ }
145+ eventData . prepare ( this . target , event . data ) ;
146+ _executeCallback ( this , eventData ) ;
147+ // this.callback.call(this._context, {
148+ // eventName: gestureToString(type),
149+ // object: event.data.view,
150+ // type,
151+ // ...event.data,
152+ // ...event.data.extraData,
153+ // });
154+ }
155+ }
119156 private onGestureStateChange ( type : GestureTypes , triggerOnstate = - 1 ) {
120157 return ( event : GestureStateEventData ) => {
121158 if ( triggerOnstate !== - 1 && event . data . state !== triggerOnstate ) {
122159 return ;
123160 }
124- if ( this . callback ) {
125- this . callback . call ( this . _context , {
126- eventName : gestureToString ( type ) ,
127- object : event . data . view ,
128- type,
129- ...event . data ,
130- ...event . data . extraData ,
131- } ) ;
132- }
161+ this . emitEvent ( type , event ) ;
133162 } ;
134163 }
135164 private onGestureTouchChange ( type : GestureTypes ) {
136165 return ( event : GestureStateEventData ) => {
137- if ( this . callback && event . data . state === GestureState . ACTIVE ) {
138- this . callback . call ( this . _context , {
139- eventName : gestureToString ( type ) ,
140- object : event . data . view ,
141- type,
142- ...event . data ,
143- ...event . data . extraData ,
144- } ) ;
166+ if ( event . data . state === GestureState . ACTIVE ) {
167+ this . emitEvent ( type , event ) ;
145168 }
146169 } ;
147170 }
@@ -163,6 +186,7 @@ export class GesturesObserver {
163186 if ( type & GestureTypes . tap ) {
164187 if ( ! gestureHandler ) {
165188 gestureHandler = manager . createGestureHandler ( HandlerType . TAP , target [ 'TAP_HANDLER_TAG' ] , {
189+ simultaneousHandlers : [ ROOT_GESTURE_HANDLER_TAG ] ,
166190 waitFor : [ target [ 'LONGPRESS_HANDLER_TAG' ] , target [ 'DOUBLE_TAP_HANDLER_TAG' ] ] ,
167191 } ) ;
168192 gestureHandler . attachToView ( target ) ;
@@ -172,7 +196,9 @@ export class GesturesObserver {
172196 }
173197 if ( type & GestureTypes . longPress ) {
174198 if ( ! gestureHandler ) {
175- gestureHandler = manager . createGestureHandler ( HandlerType . LONG_PRESS , target [ 'LONGPRESS_HANDLER_TAG' ] ) ;
199+ gestureHandler = manager . createGestureHandler ( HandlerType . LONG_PRESS , target [ 'LONGPRESS_HANDLER_TAG' ] , {
200+ simultaneousHandlers : [ ROOT_GESTURE_HANDLER_TAG ] ,
201+ } ) ;
176202 gestureHandler . attachToView ( target ) ;
177203 target . _gestureHandlers [ type ] = gestureHandler ;
178204 }
@@ -182,6 +208,7 @@ export class GesturesObserver {
182208 if ( ! gestureHandler ) {
183209 gestureHandler = manager . createGestureHandler ( HandlerType . TAP , target [ 'DOUBLE_TAP_HANDLER_TAG' ] , {
184210 numberOfTaps : 2 ,
211+ simultaneousHandlers : [ ROOT_GESTURE_HANDLER_TAG ] ,
185212 } ) ;
186213 gestureHandler . attachToView ( target ) ;
187214 target . _gestureHandlers [ type ] = gestureHandler ;
@@ -191,7 +218,9 @@ export class GesturesObserver {
191218
192219 if ( type & GestureTypes . pinch ) {
193220 if ( ! gestureHandler ) {
194- gestureHandler = manager . createGestureHandler ( HandlerType . PINCH , TAG ++ ) ;
221+ gestureHandler = manager . createGestureHandler ( HandlerType . PINCH , target [ 'PINCH_HANDLER_TAG' ] , {
222+ simultaneousHandlers : [ target [ 'PAN_HANDLER_TAG' ] , ROOT_GESTURE_HANDLER_TAG ] ,
223+ } ) ;
195224 gestureHandler . attachToView ( target ) ;
196225 target . _gestureHandlers [ type ] = gestureHandler ;
197226 }
@@ -201,7 +230,9 @@ export class GesturesObserver {
201230
202231 if ( type & GestureTypes . swipe ) {
203232 if ( ! gestureHandler ) {
204- gestureHandler = manager . createGestureHandler ( HandlerType . FLING , TAG ++ ) ;
233+ gestureHandler = manager . createGestureHandler ( HandlerType . FLING , TAG ++ , {
234+ simultaneousHandlers : [ ROOT_GESTURE_HANDLER_TAG ] ,
235+ } ) ;
205236 gestureHandler . attachToView ( target ) ;
206237 target . _gestureHandlers [ type ] = gestureHandler ;
207238 }
@@ -210,7 +241,9 @@ export class GesturesObserver {
210241
211242 if ( type & GestureTypes . pan ) {
212243 if ( ! gestureHandler ) {
213- gestureHandler = manager . createGestureHandler ( HandlerType . PAN , TAG ++ , { } ) ;
244+ gestureHandler = manager . createGestureHandler ( HandlerType . PAN , target [ 'PAN_HANDLER_TAG' ] , {
245+ simultaneousHandlers : [ target [ 'PINCH_HANDLER_TAG' ] , ROOT_GESTURE_HANDLER_TAG ] ,
246+ } ) ;
214247 gestureHandler . attachToView ( target ) ;
215248 target . _gestureHandlers [ type ] = gestureHandler ;
216249 }
@@ -220,7 +253,9 @@ export class GesturesObserver {
220253
221254 if ( type & GestureTypes . rotation ) {
222255 if ( ! gestureHandler ) {
223- gestureHandler = manager . createGestureHandler ( HandlerType . ROTATION , TAG ++ , { } ) ;
256+ gestureHandler = manager . createGestureHandler ( HandlerType . ROTATION , TAG ++ , {
257+ simultaneousHandlers : [ ROOT_GESTURE_HANDLER_TAG ] ,
258+ } ) ;
224259 gestureHandler . attachToView ( target ) ;
225260 target . _gestureHandlers [ type ] = gestureHandler ;
226261 }
@@ -237,11 +272,12 @@ export class GesturesObserver {
237272
238273 public androidOnTouchEvent ( motionEvent : android . view . MotionEvent ) {
239274 if ( this . _notifyTouch ) {
240- if ( ! this . _eventData ) {
241- this . _eventData = new TouchGestureEventData ( ) ;
275+ let eventData = this . _eventData [ GestureTypes . touch ] ;
276+ if ( ! eventData ) {
277+ eventData = this . _eventData [ GestureTypes . touch ] = new TouchGestureEventData ( ) ;
242278 }
243- this . _eventData . prepare ( this . target , motionEvent ) ;
244- _executeCallback ( this , this . _eventData ) ;
279+ eventData . prepare ( this . target , motionEvent ) ;
280+ _executeCallback ( this , eventData ) ;
245281 }
246282 }
247283}
@@ -262,14 +298,135 @@ class Pointer implements Pointer {
262298 return this . event . getY ( this . android ) / layout . getDisplayDensity ( ) ;
263299 }
264300}
265- class TouchGestureEventData implements TouchGestureEventData {
301+ class GesturePointer {
302+ android : number ;
303+ ios : number ;
304+ private event : any ;
305+ constructor ( index : number , private x , private y ) {
306+ this . android = index ;
307+ }
308+
309+ getX ( ) : number {
310+ return this . x ;
311+ }
312+
313+ getY ( ) : number {
314+ return this . y ;
315+ }
316+ }
317+
318+ class CommonGestureEventData implements GestureEventData {
319+ ios ;
320+ android ;
321+ eventName : string ;
322+ type : GestureTypes ;
323+ view : View ;
324+ object : any ;
325+ eventData : {
326+ state : GestureState ;
327+ ios ?: any ; // native View
328+ android ?: any ; // native View
329+ view ?: View ; // native View
330+ extraData : {
331+ numberOfPointers : number ;
332+ [ k : string ] : number | string ;
333+ } ;
334+ } ;
335+ state : GestureStateTypes ;
336+
337+ private _activePointers : GesturePointer [ ] ;
338+ private _allPointers : GesturePointer [ ] ;
339+
340+ constructor ( type : GestureTypes ) {
341+ this . eventName = gestureToString ( type ) ;
342+ this . type = type ;
343+ }
344+
345+ public prepare ( view : View , eventData ) {
346+ this . view = view ;
347+ this . object = view ;
348+ this . _activePointers = undefined ;
349+ this . _allPointers = undefined ;
350+ this . eventData = eventData ;
351+ switch ( this . eventData . state ) {
352+ case GestureState . BEGAN :
353+ this . state = GestureStateTypes . began ;
354+ break ;
355+ case GestureState . CANCELLED :
356+ case GestureState . FAILED :
357+ this . state = GestureStateTypes . cancelled ;
358+ break ;
359+ case GestureState . ACTIVE :
360+ this . state = GestureStateTypes . changed ;
361+ break ;
362+ case GestureState . END :
363+ this . state = GestureStateTypes . ended ;
364+ break ;
365+ }
366+ }
367+
368+ get extraData ( ) {
369+ return this . eventData . extraData ;
370+ }
371+
372+ getPointerCount ( ) : number {
373+ return this . extraData . numberOfPointers ;
374+ }
375+
376+ getActivePointers ( ) {
377+ // Only one active pointer in Android
378+ if ( ! this . _activePointers ) {
379+ const positions = this . extraData . positions ;
380+ this . _activePointers = [ new GesturePointer ( 0 , positions [ 0 ] , positions [ 1 ] ) ] ;
381+ }
382+ return this . _activePointers ;
383+ }
384+
385+ getAllPointers ( ) {
386+ if ( ! this . _allPointers ) {
387+ this . _allPointers = [ ] ;
388+ const positions = this . extraData . positions ;
389+ for ( let i = 0 ; i < this . getPointerCount ( ) ; i ++ ) {
390+ this . _allPointers . push ( new GesturePointer ( i , positions [ i * 2 ] , positions [ i * 2 + 1 ] ) ) ;
391+ }
392+ }
393+ return this . _allPointers ;
394+ }
395+
396+ getX ( ) : number {
397+ return this . extraData . x as number ;
398+ }
399+
400+ getY ( ) : number {
401+ return this . extraData . y as number ;
402+ }
403+
404+ private getActionType ( e : android . view . MotionEvent ) : string {
405+ switch ( e . getActionMasked ( ) ) {
406+ case android . view . MotionEvent . ACTION_DOWN :
407+ case android . view . MotionEvent . ACTION_POINTER_DOWN :
408+ return TouchAction . down ;
409+ case android . view . MotionEvent . ACTION_MOVE :
410+ return TouchAction . move ;
411+ case android . view . MotionEvent . ACTION_UP :
412+ case android . view . MotionEvent . ACTION_POINTER_UP :
413+ return TouchAction . up ;
414+ case android . view . MotionEvent . ACTION_CANCEL :
415+ return TouchAction . cancel ;
416+ }
417+
418+ return '' ;
419+ }
420+ }
421+ class TouchGestureEventData {
266422 eventName : string = gestureToString ( GestureTypes . touch ) ;
267423 type : GestureTypes = GestureTypes . touch ;
268424 ios : any = undefined ;
269425 action : string ;
270426 view : View ;
271427 android : android . view . MotionEvent ;
272428 object : any ;
429+ state : GestureStateTypes ;
273430
274431 private _activePointers : Pointer [ ] ;
275432 private _allPointers : Pointer [ ] ;
@@ -331,6 +488,34 @@ class TouchGestureEventData implements TouchGestureEventData {
331488 }
332489}
333490
491+ function _getSwipeDirection ( direction : string ) : SwipeDirection {
492+ return SwipeDirection [ direction ] ;
493+ }
494+ class SwipeGestureEventData extends CommonGestureEventData {
495+ get direction ( ) {
496+ return _getSwipeDirection ( this . extraData . direction as string ) ;
497+ }
498+ }
499+ class PanGestureEventData extends CommonGestureEventData {
500+ get deltaX ( ) {
501+ return this . eventData . extraData . translationX ;
502+ }
503+ get deltaY ( ) {
504+ return this . eventData . extraData . translationY ;
505+ }
506+ }
507+ class PinchGestureEventData extends CommonGestureEventData {
508+ getFocusX ( ) {
509+ return this . eventData . extraData . focalX ;
510+ }
511+ getFocusY ( ) {
512+ return this . eventData . extraData . focalY ;
513+ }
514+ get scale ( ) {
515+ return this . eventData . extraData . scale ;
516+ }
517+ }
518+
334519function _executeCallback ( observer : GesturesObserver , args : GestureEventData ) {
335520 if ( observer && observer . callback ) {
336521 observer . callback . call ( ( observer as any ) . _context , args ) ;
0 commit comments