Merge pull request #1088 from NativeScript/gestures-state

states for various gestures added
This commit is contained in:
Vladimir Enchev
2015-11-12 14:15:22 +02:00
5 changed files with 134 additions and 21 deletions

View File

@ -28,21 +28,25 @@ export function createPage() {
var swipeLabel = new labelModule.Label(); var swipeLabel = new labelModule.Label();
swipeLabel.height = labelHeight; swipeLabel.height = labelHeight;
swipeLabel.text = "Swipe here"; swipeLabel.text = "Swipe here";
swipeLabel.textWrap = true;
stack.addChild(swipeLabel); stack.addChild(swipeLabel);
var panLabel = new labelModule.Label(); var panLabel = new labelModule.Label();
panLabel.height = labelHeight; panLabel.height = labelHeight;
panLabel.text = "Pan here"; panLabel.text = "Pan here";
panLabel.textWrap = true;
stack.addChild(panLabel); stack.addChild(panLabel);
var pinchLabel = new labelModule.Label(); var pinchLabel = new labelModule.Label();
pinchLabel.height = labelHeight; pinchLabel.height = labelHeight;
pinchLabel.text = "Pinch here"; pinchLabel.text = "Pinch here";
pinchLabel.textWrap = true;
stack.addChild(pinchLabel); stack.addChild(pinchLabel);
var rotaionLabel = new labelModule.Label(); var rotaionLabel = new labelModule.Label();
rotaionLabel.height = labelHeight; rotaionLabel.height = labelHeight;
rotaionLabel.text = "Rotate here"; rotaionLabel.text = "Rotate here";
rotaionLabel.textWrap = true;
stack.addChild(rotaionLabel); stack.addChild(rotaionLabel);
stopButton.on(button.Button.tapEvent, function () { stopButton.on(button.Button.tapEvent, function () {
@ -81,25 +85,25 @@ export function createPage() {
var observer3 = longpressLabel.getGestureObservers(gestures.GestureTypes.longPress)[0]; var observer3 = longpressLabel.getGestureObservers(gestures.GestureTypes.longPress)[0];
swipeLabel.on(gestures.GestureTypes.swipe, function (args: gestures.SwipeGestureEventData) { 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]; var observer4 = swipeLabel.getGestureObservers(gestures.GestureTypes.swipe)[0];
panLabel.on(gestures.GestureTypes.pan, function (args: gestures.PanGestureEventData) { 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]; var observer5 = panLabel.getGestureObservers(gestures.GestureTypes.pan)[0];
pinchLabel.on(gestures.GestureTypes.pinch, function (args: gestures.PinchGestureEventData) { 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]; var observer6 = pinchLabel.getGestureObservers(gestures.GestureTypes.pinch)[0];
rotaionLabel.on(gestures.GestureTypes.rotation, function (args: gestures.RotationGestureEventData) { 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]; var observer7 = rotaionLabel.getGestureObservers(gestures.GestureTypes.rotation)[0];
@ -107,4 +111,22 @@ export function createPage() {
var page = new pages.Page(); var page = new pages.Page();
page.content = stack; page.content = stack;
return page; return page;
}
var states = new Array<string>();
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(",");
} }

View File

@ -12,13 +12,10 @@ export enum GestureTypes {
} }
export enum GestureStateTypes { export enum GestureStateTypes {
possible = 1 << 0, cancelled,
recognized = 1 << 1, began,
failed = 1 << 2, changed,
cancelled = 1 << 3, ended
began = 1 << 4,
changed = 1 << 5,
ended = 1 << 6
} }
export enum SwipeDirection { export enum SwipeDirection {

View File

@ -116,7 +116,8 @@ export class GesturesObserver extends common.GesturesObserver {
rotation: degrees, rotation: degrees,
ios: undefined, ios: undefined,
object: this.target, object: this.target,
eventName: definition.toString(definition.GestureTypes.rotation) eventName: definition.toString(definition.GestureTypes.rotation),
state: getState(motionEvent)
} }
//var observer = that.get(); //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 { function _getArgs(type: definition.GestureTypes, view: view.View, e: android.view.MotionEvent): definition.GestureEventData {
return <definition.GestureEventData>{ return <definition.GestureEventData>{
type: type, type: type,
@ -149,6 +162,7 @@ function _getSwipeArgs(direction: definition.SwipeDirection, view: view.View,
ios: undefined, ios: undefined,
object: view, object: view,
eventName: definition.toString(definition.GestureTypes.swipe), eventName: definition.toString(definition.GestureTypes.swipe),
state: getState(currentEvent)
}; };
} }
@ -163,6 +177,7 @@ function _getPanArgs(deltaX: number, deltaY: number, view: view.View,
ios: undefined, ios: undefined,
object: view, object: view,
eventName: definition.toString(definition.GestureTypes.pan), 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 { class PinchGestureListener extends android.view.ScaleGestureDetector.SimpleOnScaleGestureListener {
private _observer: GesturesObserver; private _observer: GesturesObserver;
private _target: view.View; private _target: view.View;
private _state: common.GestureStateTypes;
constructor(observer: GesturesObserver, target: view.View) { constructor(observer: GesturesObserver, target: view.View) {
super(); super();
@ -235,12 +251,45 @@ class PinchGestureListener extends android.view.ScaleGestureDetector.SimpleOnSca
scale: detector.getScaleFactor(), scale: detector.getScaleFactor(),
object: this._target, object: this._target,
eventName: definition.toString(definition.GestureTypes.pinch), eventName: definition.toString(definition.GestureTypes.pinch),
ios: undefined ios: undefined,
state: common.GestureStateTypes.changed
}; };
_executeCallback(this._observer, args); _executeCallback(this._observer, args);
return true; return true;
} }
public onScaleBegin(detector: android.view.ScaleGestureDetector): boolean {
var args = <definition.PinchGestureEventData>{
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 = <definition.PinchGestureEventData>{
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 { class SwipeGestureListener extends android.view.GestureDetector.SimpleOnGestureListener {

View File

@ -39,6 +39,28 @@ declare module "ui/gestures" {
longPress 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. * Defines an enum for swipe gesture direction.
*/ */
@ -86,21 +108,28 @@ declare module "ui/gestures" {
/** /**
* Provides gesture event data for pinch gesture. * 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; scale: number;
} }
/** /**
* Provides gesture event data for swipe gesture. * Provides gesture event data for swipe gesture.
*/ */
export interface SwipeGestureEventData extends GestureEventData { export interface SwipeGestureEventData extends GestureEventDataWithState {
direction: SwipeDirection; direction: SwipeDirection;
} }
/** /**
* Provides gesture event data for pan gesture. * Provides gesture event data for pan gesture.
*/ */
export interface PanGestureEventData extends GestureEventData { export interface PanGestureEventData extends GestureEventDataWithState {
deltaX: number; deltaX: number;
deltaY: number; deltaY: number;
} }
@ -108,7 +137,7 @@ declare module "ui/gestures" {
/** /**
* Provides gesture event data for rotation gesture. * Provides gesture event data for rotation gesture.
*/ */
export interface RotationGestureEventData extends GestureEventData { export interface RotationGestureEventData extends GestureEventDataWithState {
rotation: number; rotation: number;
} }

View File

@ -238,6 +238,18 @@ function _getUIGestureRecognizerType(type: definition.GestureTypes): any {
return nativeType; 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 { function _getSwipeDirection(direction: UISwipeGestureRecognizerDirection): definition.SwipeDirection {
if (direction === UISwipeGestureRecognizerDirection.UISwipeGestureRecognizerDirectionDown) { if (direction === UISwipeGestureRecognizerDirection.UISwipeGestureRecognizerDirectionDown) {
return definition.SwipeDirection.down; return definition.SwipeDirection.down;
@ -259,7 +271,8 @@ function _getPinchData(args: definition.GestureEventData): definition.PinchGestu
android: undefined, android: undefined,
scale: recognizer.scale, scale: recognizer.scale,
object: args.view, 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, android: undefined,
direction: _getSwipeDirection(recognizer.direction), direction: _getSwipeDirection(recognizer.direction),
object: args.view, 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, deltaX: recognizer.translationInView(view).x,
deltaY: recognizer.translationInView(view).y, deltaY: recognizer.translationInView(view).y,
object: args.view, 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, android: undefined,
rotation: recognizer.rotation * (180.0 / Math.PI), rotation: recognizer.rotation * (180.0 / Math.PI),
object: args.view, object: args.view,
eventName: definition.toString(args.type) eventName: definition.toString(args.type),
state: getState(recognizer)
}; };
} }