From 25c45866219d40b9d4bdfe2787f1d7bdbe9278e5 Mon Sep 17 00:00:00 2001 From: Vladimir Enchev Date: Thu, 12 Nov 2015 12:43:17 +0200 Subject: [PATCH] states for various gestures added --- apps/ui-tests-app/pages/gestures.ts | 30 +++++++++++++--- ui/gestures/gestures-common.ts | 11 +++--- ui/gestures/gestures.android.ts | 53 +++++++++++++++++++++++++++-- ui/gestures/gestures.d.ts | 37 +++++++++++++++++--- ui/gestures/gestures.ios.ts | 24 ++++++++++--- 5 files changed, 134 insertions(+), 21 deletions(-) diff --git a/apps/ui-tests-app/pages/gestures.ts b/apps/ui-tests-app/pages/gestures.ts index 4a1667103..3952cf103 100644 --- a/apps/ui-tests-app/pages/gestures.ts +++ b/apps/ui-tests-app/pages/gestures.ts @@ -28,21 +28,25 @@ export function createPage() { var swipeLabel = new labelModule.Label(); swipeLabel.height = labelHeight; swipeLabel.text = "Swipe here"; + swipeLabel.textWrap = true; stack.addChild(swipeLabel); var panLabel = new labelModule.Label(); panLabel.height = labelHeight; panLabel.text = "Pan here"; + panLabel.textWrap = true; stack.addChild(panLabel); var pinchLabel = new labelModule.Label(); pinchLabel.height = labelHeight; pinchLabel.text = "Pinch here"; + pinchLabel.textWrap = true; stack.addChild(pinchLabel); var rotaionLabel = new labelModule.Label(); rotaionLabel.height = labelHeight; rotaionLabel.text = "Rotate here"; + rotaionLabel.textWrap = true; stack.addChild(rotaionLabel); stopButton.on(button.Button.tapEvent, function () { @@ -81,25 +85,25 @@ export function createPage() { var observer3 = longpressLabel.getGestureObservers(gestures.GestureTypes.longPress)[0]; swipeLabel.on(gestures.GestureTypes.swipe, function (args: gestures.SwipeGestureEventData) { - swipeLabel.text = "Swipe Direction: " + args.direction + ", " + (args.object === swipeLabel); + swipeLabel.text = "Swipe Direction: " + args.direction + ", " + (args.object === swipeLabel) + getStateAsString(args.state); }); var observer4 = swipeLabel.getGestureObservers(gestures.GestureTypes.swipe)[0]; panLabel.on(gestures.GestureTypes.pan, function (args: gestures.PanGestureEventData) { - panLabel.text = "Pan deltaX:" + args.deltaX + "; deltaY:" + args.deltaY + ";" + ", " + (args.object === panLabel); + panLabel.text = "Pan deltaX:" + Math.round(args.deltaX) + "; deltaY:" + Math.round(args.deltaX) + ";" + ", " + (args.object === panLabel) + getStateAsString(args.state); }); var observer5 = panLabel.getGestureObservers(gestures.GestureTypes.pan)[0]; pinchLabel.on(gestures.GestureTypes.pinch, function (args: gestures.PinchGestureEventData) { - pinchLabel.text = "Pinch Scale: " + args.scale + ", " + (args.object === pinchLabel); + pinchLabel.text = "Pinch Scale: " + Math.round(args.scale) + ", " + (args.object === pinchLabel) + getStateAsString(args.state); }); var observer6 = pinchLabel.getGestureObservers(gestures.GestureTypes.pinch)[0]; rotaionLabel.on(gestures.GestureTypes.rotation, function (args: gestures.RotationGestureEventData) { - rotaionLabel.text = "Rotation: " + args.rotation + ", " + (args.object === rotaionLabel); + rotaionLabel.text = "Rotation: " + Math.round(args.rotation) + ", " + (args.object === rotaionLabel) + getStateAsString(args.state); }); var observer7 = rotaionLabel.getGestureObservers(gestures.GestureTypes.rotation)[0]; @@ -107,4 +111,22 @@ export function createPage() { var page = new pages.Page(); page.content = stack; return page; +} + +var states = new Array(); +function getStateAsString(state: gestures.GestureStateTypes): string { + if (state === gestures.GestureStateTypes.began) { + states.length = 0; + states.push("began"); + } else if (state === gestures.GestureStateTypes.cancelled) { + states.push("cancelled"); + } else if (state === gestures.GestureStateTypes.changed) { + if (states.indexOf("changed") === -1) { + states.push("changed"); + } + } else if (state === gestures.GestureStateTypes.ended) { + states.push("ended"); + } + + return ", states: " + states.join(","); } \ No newline at end of file diff --git a/ui/gestures/gestures-common.ts b/ui/gestures/gestures-common.ts index ce2df0276..90226ec46 100644 --- a/ui/gestures/gestures-common.ts +++ b/ui/gestures/gestures-common.ts @@ -12,13 +12,10 @@ export enum GestureTypes { } export enum GestureStateTypes { - possible = 1 << 0, - recognized = 1 << 1, - failed = 1 << 2, - cancelled = 1 << 3, - began = 1 << 4, - changed = 1 << 5, - ended = 1 << 6 + cancelled, + began, + changed, + ended } export enum SwipeDirection { diff --git a/ui/gestures/gestures.android.ts b/ui/gestures/gestures.android.ts index a3feed894..bf6967f2a 100644 --- a/ui/gestures/gestures.android.ts +++ b/ui/gestures/gestures.android.ts @@ -116,7 +116,8 @@ export class GesturesObserver extends common.GesturesObserver { rotation: degrees, ios: undefined, object: this.target, - eventName: definition.toString(definition.GestureTypes.rotation) + eventName: definition.toString(definition.GestureTypes.rotation), + state: getState(motionEvent) } //var observer = that.get(); @@ -128,6 +129,18 @@ export class GesturesObserver extends common.GesturesObserver { } } +function getState(e: android.view.MotionEvent) { + if (e.getAction() === android.view.MotionEvent.ACTION_DOWN) { + return common.GestureStateTypes.began; + } else if (e.getAction() === android.view.MotionEvent.ACTION_CANCEL) { + return common.GestureStateTypes.cancelled; + } else if (e.getAction() === android.view.MotionEvent.ACTION_MOVE) { + return common.GestureStateTypes.changed; + } else if (e.getAction() === android.view.MotionEvent.ACTION_UP) { + return common.GestureStateTypes.ended; + } +} + function _getArgs(type: definition.GestureTypes, view: view.View, e: android.view.MotionEvent): definition.GestureEventData { return { type: type, @@ -149,6 +162,7 @@ function _getSwipeArgs(direction: definition.SwipeDirection, view: view.View, ios: undefined, object: view, eventName: definition.toString(definition.GestureTypes.swipe), + state: getState(currentEvent) }; } @@ -163,6 +177,7 @@ function _getPanArgs(deltaX: number, deltaY: number, view: view.View, ios: undefined, object: view, eventName: definition.toString(definition.GestureTypes.pan), + state: getState(currentEvent) }; } @@ -217,6 +232,7 @@ class TapAndDoubleTapGestureListener extends android.view.GestureDetector.Simple class PinchGestureListener extends android.view.ScaleGestureDetector.SimpleOnScaleGestureListener { private _observer: GesturesObserver; private _target: view.View; + private _state: common.GestureStateTypes; constructor(observer: GesturesObserver, target: view.View) { super(); @@ -235,12 +251,45 @@ class PinchGestureListener extends android.view.ScaleGestureDetector.SimpleOnSca scale: detector.getScaleFactor(), object: this._target, eventName: definition.toString(definition.GestureTypes.pinch), - ios: undefined + ios: undefined, + state: common.GestureStateTypes.changed }; _executeCallback(this._observer, args); return true; } + + public onScaleBegin(detector: android.view.ScaleGestureDetector): boolean { + var args = { + type: definition.GestureTypes.pinch, + view: this._target, + android: detector, + scale: detector.getScaleFactor(), + object: this._target, + eventName: definition.toString(definition.GestureTypes.pinch), + ios: undefined, + state: common.GestureStateTypes.began + }; + + _executeCallback(this._observer, args); + + return true; + } + + public onScaleEnd(detector: android.view.ScaleGestureDetector): void { + var args = { + type: definition.GestureTypes.pinch, + view: this._target, + android: detector, + scale: detector.getScaleFactor(), + object: this._target, + eventName: definition.toString(definition.GestureTypes.pinch), + ios: undefined, + state: common.GestureStateTypes.ended + }; + + _executeCallback(this._observer, args); + } } class SwipeGestureListener extends android.view.GestureDetector.SimpleOnGestureListener { diff --git a/ui/gestures/gestures.d.ts b/ui/gestures/gestures.d.ts index 3add21a14..2c8c14232 100644 --- a/ui/gestures/gestures.d.ts +++ b/ui/gestures/gestures.d.ts @@ -39,6 +39,28 @@ declare module "ui/gestures" { longPress } + /** + * Defines an enum with supported gesture types. + */ + export enum GestureStateTypes { + /** + * Gesture cancelled. + */ + cancelled, + /** + * Gesture began. + */ + began, + /** + * Gesture changed. + */ + changed, + /** + * Gesture ended. + */ + ended + } + /** * Defines an enum for swipe gesture direction. */ @@ -86,21 +108,28 @@ declare module "ui/gestures" { /** * Provides gesture event data for pinch gesture. */ - export interface PinchGestureEventData extends GestureEventData { + export interface GestureEventDataWithState extends GestureEventData { + state: number; + } + + /** + * Provides gesture event data for pinch gesture. + */ + export interface PinchGestureEventData extends GestureEventDataWithState { scale: number; } /** * Provides gesture event data for swipe gesture. */ - export interface SwipeGestureEventData extends GestureEventData { + export interface SwipeGestureEventData extends GestureEventDataWithState { direction: SwipeDirection; } /** * Provides gesture event data for pan gesture. */ - export interface PanGestureEventData extends GestureEventData { + export interface PanGestureEventData extends GestureEventDataWithState { deltaX: number; deltaY: number; } @@ -108,7 +137,7 @@ declare module "ui/gestures" { /** * Provides gesture event data for rotation gesture. */ - export interface RotationGestureEventData extends GestureEventData { + export interface RotationGestureEventData extends GestureEventDataWithState { rotation: number; } diff --git a/ui/gestures/gestures.ios.ts b/ui/gestures/gestures.ios.ts index b7d4f7820..bd3cc623f 100644 --- a/ui/gestures/gestures.ios.ts +++ b/ui/gestures/gestures.ios.ts @@ -238,6 +238,18 @@ function _getUIGestureRecognizerType(type: definition.GestureTypes): any { return nativeType; } +function getState(recognizer: UIGestureRecognizer) { + if (recognizer.state === UIGestureRecognizerState.UIGestureRecognizerStateBegan) { + return common.GestureStateTypes.began; + } else if (recognizer.state === UIGestureRecognizerState.UIGestureRecognizerStateCancelled) { + return common.GestureStateTypes.cancelled; + } else if (recognizer.state === UIGestureRecognizerState.UIGestureRecognizerStateChanged) { + return common.GestureStateTypes.changed; + } else if (recognizer.state === UIGestureRecognizerState.UIGestureRecognizerStateEnded) { + return common.GestureStateTypes.ended; + } +} + function _getSwipeDirection(direction: UISwipeGestureRecognizerDirection): definition.SwipeDirection { if (direction === UISwipeGestureRecognizerDirection.UISwipeGestureRecognizerDirectionDown) { return definition.SwipeDirection.down; @@ -259,7 +271,8 @@ function _getPinchData(args: definition.GestureEventData): definition.PinchGestu android: undefined, scale: recognizer.scale, object: args.view, - eventName: definition.toString(args.type) + eventName: definition.toString(args.type), + state: getState(recognizer) }; } @@ -272,7 +285,8 @@ function _getSwipeData(args: definition.GestureEventData): definition.SwipeGestu android: undefined, direction: _getSwipeDirection(recognizer.direction), object: args.view, - eventName: definition.toString(args.type) + eventName: definition.toString(args.type), + state: getState(recognizer) }; } @@ -286,7 +300,8 @@ function _getPanData(args: definition.GestureEventData, view: UIView): definitio deltaX: recognizer.translationInView(view).x, deltaY: recognizer.translationInView(view).y, object: args.view, - eventName: definition.toString(args.type) + eventName: definition.toString(args.type), + state: getState(recognizer) }; } @@ -299,6 +314,7 @@ function _getRotationData(args: definition.GestureEventData): definition.Rotatio android: undefined, rotation: recognizer.rotation * (180.0 / Math.PI), object: args.view, - eventName: definition.toString(args.type) + eventName: definition.toString(args.type), + state: getState(recognizer) }; }