diff --git a/ui/gestures/gestures.android.ts b/ui/gestures/gestures.android.ts index 6569e22ab..abfe72b38 100644 --- a/ui/gestures/gestures.android.ts +++ b/ui/gestures/gestures.android.ts @@ -21,6 +21,8 @@ export class GesturesObserver extends common.GesturesObserver { private _panGestureDetector: CustomPanGestureDetector; private _rotateGestureDetector: CustomRotateGestureDetector; + private _eventData: TouchGestureEventData; + private _onTargetLoaded: (data: observable.EventData) => void; private _onTargetUnloaded: (data: observable.EventData) => void; @@ -62,12 +64,13 @@ export class GesturesObserver extends common.GesturesObserver { private _detach() { trace.write(this.target + "._detach() android:" + this.target._nativeView, "gestures"); + this._notifyTouch = false this._simpleGestureDetector = null; this._scaleGestureDetector = null; this._swipeGestureDetector = null; this._panGestureDetector = null; this._rotateGestureDetector = null; - this._notifyTouch = false + this._eventData = null; } private _attach(target: view.View, type: definition.GestureTypes) { @@ -101,7 +104,12 @@ export class GesturesObserver extends common.GesturesObserver { public androidOnTouchEvent(motionEvent: android.view.MotionEvent) { if (this._notifyTouch) { - _executeCallback(this, new TouchGestureEventData(this.target, motionEvent)); + if (!this._eventData) { + this._eventData = new TouchGestureEventData(); + } + + this._eventData.prepare(this.target, motionEvent); + _executeCallback(this, this._eventData); } if (this._simpleGestureDetector) { @@ -604,22 +612,24 @@ class Pointer implements definition.Pointer { class TouchGestureEventData implements definition.TouchGestureEventData { eventName: string = definition.toString(definition.GestureTypes.touch); - action: string; type: definition.GestureTypes = definition.GestureTypes.touch; - view: view.View; ios: any = undefined; + action: string; + view: view.View; android: android.view.MotionEvent; object: any; private _activePointers: Array; private _allPointers: Array; - constructor(view: view.View, e: android.view.MotionEvent) { + public prepare(view: view.View, e: android.view.MotionEvent) { this.view = view; this.object = view; this.android = e; - this.action = this.getActionType(e); + + this._activePointers = undefined; + this._allPointers = undefined; } getPointerCount(): number { diff --git a/ui/gestures/gestures.d.ts b/ui/gestures/gestures.d.ts index 365da05ef..6b720f028 100644 --- a/ui/gestures/gestures.d.ts +++ b/ui/gestures/gestures.d.ts @@ -240,9 +240,11 @@ declare module "ui/gestures" { export class GesturesObserver { /** * Creates an instance of GesturesObserver class. + * @param target - The view for which the observer is created. * @param callback - A function that will be executed when a gesture is received. + * @param context - default this argument for the callbacks. */ - constructor(target: view.View, callback: (args: GestureEventData) => void, thisArg: any); + constructor(target: view.View, callback: (args: GestureEventData) => void, context: any); /** * Registers a gesture observer to a view and gesture. @@ -281,8 +283,9 @@ declare module "ui/gestures" { * @param target - View which will be watched for originating a specific gesture. * @param type - Type of the gesture. * @param callback - A function that will be executed when a gesture is received. + * @param context - this argument for the callback. */ - export function observe(target: view.View, type: GestureTypes, callback: (args: GestureEventData) => void, thisArg?: any): GesturesObserver; + export function observe(target: view.View, type: GestureTypes, callback: (args: GestureEventData) => void, context?: any): GesturesObserver; /** * Returns a string representation of a gesture type. diff --git a/ui/gestures/gestures.ios.ts b/ui/gestures/gestures.ios.ts index 4ac22ffe2..31a4086f5 100644 --- a/ui/gestures/gestures.ios.ts +++ b/ui/gestures/gestures.ios.ts @@ -342,6 +342,7 @@ function _getRotationData(args: definition.GestureEventData): definition.Rotatio class TouchGestureRecognizer extends UIGestureRecognizer { public observer: GesturesObserver; + private _eventData: TouchGestureEventData; touchesBeganWithEvent(touches: NSSet, event: any): void { this.executeCallback(common.TouchAction.down, touches, event); @@ -360,8 +361,12 @@ class TouchGestureRecognizer extends UIGestureRecognizer { } private executeCallback(action: string, touches: NSSet, event: any): void { - var args = new TouchGestureEventData(this.observer.target, action, touches, event); - this.observer._executeCallback(args); + if (!this._eventData) { + this._eventData = new TouchGestureEventData(); + } + + this._eventData.prepare(this.observer.target, action, touches, event); + this.observer._executeCallback(this._eventData); } } @@ -396,43 +401,47 @@ class Pointer implements definition.Pointer { class TouchGestureEventData implements definition.TouchGestureEventData { eventName: string = definition.toString(definition.GestureTypes.touch); - action: string; type: definition.GestureTypes = definition.GestureTypes.touch; + android: any = undefined; + action: string; view: view.View; ios: { touches: NSSet, event: { allTouches: () => NSSet } }; - android: any = undefined; object: any; - private _allPinters: Array; + private _activePointers: Array; - + private _allPointers: Array; private _mainPointer: UITouch; - private get mainPointer(): UITouch { - if (types.isUndefined(this._mainPointer)) { - this._mainPointer = this.ios.touches.anyObject(); - } - return this._mainPointer; - } - constructor(view: view.View, action: string, touches: NSSet, event: any) { + public prepare(view: view.View, action: string, touches: NSSet, event: any) { + this.action = action; this.view = view; this.object = view; - this.action = action; this.ios = { touches: touches, event: event }; + + this._mainPointer = undefined; + this._activePointers = undefined; + this._allPointers = undefined; } getPointerCount(): number { return this.ios.event.allTouches().count; } + private getMainPointer(): UITouch { + if (types.isUndefined(this._mainPointer)) { + this._mainPointer = this.ios.touches.anyObject(); + } + return this._mainPointer; + } + getActivePointers(): Array { if (!this._activePointers) { this._activePointers = []; - let nsArr = this.ios.touches.allObjects; - for (var i = 0; i < nsArr.count; i++) { + for (let i = 0, nsArr = this.ios.touches.allObjects; i < nsArr.count; i++) { this._activePointers.push(new Pointer(nsArr.objectAtIndex(i), this.view)); } } @@ -441,23 +450,23 @@ class TouchGestureEventData implements definition.TouchGestureEventData { } getAllPointers(): Array { - if (!this._allPinters) { - this._allPinters = []; + if (!this._allPointers) { + this._allPointers = []; let nsArr = this.ios.event.allTouches().allObjects; for (var i = 0; i < nsArr.count; i++) { - this._allPinters.push(new Pointer(nsArr.objectAtIndex(i), this.view)); + this._allPointers.push(new Pointer(nsArr.objectAtIndex(i), this.view)); } } - return this._allPinters; + return this._allPointers; } getX(): number { - return this.mainPointer.locationInView(this.view._nativeView).x; + return this.getMainPointer().locationInView(this.view._nativeView).x; } getY(): number { - return this.mainPointer.locationInView(this.view._nativeView).y + return this.getMainPointer().locationInView(this.view._nativeView).y } } \ No newline at end of file