gestureObservers exposed to public via getGestureObservers method.

This commit is contained in:
Nedyalko Nikolov
2015-06-02 10:30:19 +03:00
parent 137688dba1
commit ae6fc36ec1
9 changed files with 242 additions and 128 deletions

View File

@@ -132,7 +132,16 @@ export class View extends proxy.ProxyObject implements definition.View {
public _cssClasses: Array<string> = [];
public _gestureObservers = {};
public _gestureObservers: Map<number, Array<gestures.GesturesObserver>>;
public getGestureObservers(type: gestures.GestureTypes): Array<gestures.GesturesObserver> {
var result;
if (this._gestureObservers) {
result = this._gestureObservers.get(type) ? this._gestureObservers.get(type).slice(0) : undefined;
}
return result;
}
private _updatingInheritedProperties: boolean;
public _options: definition.Options;
@@ -147,7 +156,7 @@ export class View extends proxy.ProxyObject implements definition.View {
this._visualState = visualStateConstants.Normal;
}
observe(type: number, callback: (args: gestures.GestureEventData) => void, thisArg?: any): void {
observe(type: gestures.GestureTypes, callback: (args: gestures.GestureEventData) => void, thisArg?: any): void {
var gesturesList = this._getGesturesList(type, true);
gesturesList.push(gestures.observe(this, type, callback, thisArg));
}
@@ -157,10 +166,18 @@ export class View extends proxy.ProxyObject implements definition.View {
throw new Error("GestureType must be a valid gesture!");
}
var list = this._gestureObservers[gestureType];
if (!list && createIfNeeded) {
list = [];
this._gestureObservers[gestureType] = list;
var list: Array<gestures.GesturesObserver>;
if (this._gestureObservers && this._gestureObservers.has(gestureType)) {
list = this._gestureObservers.get(gestureType);
}
else {
if (createIfNeeded) {
list = [];
if (!this._gestureObservers) {
this._gestureObservers = new Map<number, Array<gestures.GesturesObserver>>();
}
this._gestureObservers.set(gestureType, list);
}
}
return list;
}

View File

@@ -78,6 +78,15 @@ export class View extends viewCommon.View {
this._updateOnTouchListener(this.isUserInteractionEnabled);
}
observe(type: gestures.GestureTypes, callback: (args: gestures.GestureEventData) => void, thisArg?: any): void {
super.observe(type, callback, thisArg);
if (this.isLoaded && !this.touchListenerIsSet) {
this.setOnTouchListener();
}
}
private touchListenerIsSet: boolean;
public onLoaded() {
super.onLoaded();
this.setOnTouchListener();
@@ -87,11 +96,17 @@ export class View extends viewCommon.View {
super.onUnloaded();
if (this._nativeView && this._nativeView.setOnTouchListener) {
this._nativeView.setOnTouchListener(null);
this.touchListenerIsSet = false;
}
}
private hasGestureObservers() {
return this._gestureObservers ? this._gestureObservers.size > 0 : false;
}
private setOnTouchListener() {
if (this._nativeView && this._nativeView.setOnTouchListener && Object.keys(this._gestureObservers).length > 0) {
if (this._nativeView && this._nativeView.setOnTouchListener && this.hasGestureObservers()) {
this.touchListenerIsSet = true;
var that = new WeakRef(this);
if (this._nativeView.setClickable) {
this._nativeView.setClickable(true);
@@ -102,47 +117,15 @@ export class View extends viewCommon.View {
if (!owner) {
return false;
}
var i;
for (var prop in owner._gestureObservers) {
if (owner._gestureObservers.hasOwnProperty(prop)) {
for (i = 0; i < owner._gestureObservers[prop].length; i++) {
var gestureObserver = owner._gestureObservers[prop][i];
if (gestureObserver._simpleGestureDetector) {
gestureObserver._simpleGestureDetector.onTouchEvent(motionEvent);
}
if (gestureObserver._scaleGestureDetector) {
gestureObserver._scaleGestureDetector.onTouchEvent(motionEvent);
}
if (gestureObserver._swipeGestureDetector) {
gestureObserver._swipeGestureDetector.onTouchEvent(motionEvent);
}
if (gestureObserver._panGestureDetector) {
gestureObserver._panGestureDetector.onTouchEvent(motionEvent);
}
if (gestureObserver.type & gestures.GestureTypes.rotation && motionEvent.getPointerCount() === 2) {
var deltaX = motionEvent.getX(0) - motionEvent.getX(1);
var deltaY = motionEvent.getY(0) - motionEvent.getY(1);
var radians = Math.atan(deltaY / deltaX);
var degrees = radians * (180 / Math.PI);
var args = <gestures.RotationGestureEventData>{
type: gestures.GestureTypes.rotation,
view: owner,
android: motionEvent,
rotation: degrees,
ios: null
}
//var observer = that.get();
if (gestureObserver.callback) {
gestureObserver.callback.call(gestureObserver._context, args);
}
for (var gestType in gestures.GestureTypes) {
if (gestures.GestureTypes.hasOwnProperty(gestType)) {
var gestArray = owner.getGestureObservers(gestType);
if (gestArray) {
for (i = 0; i < gestArray.length; i++) {
var gestObserver = gestArray[i];
gestObserver.androidOnTouchEvent(motionEvent);
}
}
}

11
ui/core/view.d.ts vendored
View File

@@ -355,7 +355,15 @@ declare module "ui/core/view" {
*/
public focus(): boolean;
observe(type: number, callback: (args: gestures.GestureEventData) => void, thisArg?: any);
public getGestureObservers(type: gestures.GestureTypes): Array<gestures.GesturesObserver>;
/**
* Adds a gesture observer.
* @param type - Type of the gesture.
* @param callback - A function that will be executed when gesture is received.
* @param thisArg - An optional parameter which will be used as `this` context for callback execution.
*/
observe(type: gestures.GestureTypes, callback: (args: gestures.GestureEventData) => void, thisArg?: any);
/**
* A basic method signature to hook an event listener (shortcut alias to the addEventListener method).
@@ -386,6 +394,7 @@ declare module "ui/core/view" {
// TODO: Implement logic for stripping these lines out
//@private
_gestureObservers: Map<number, Array<gestures.GesturesObserver>>;
_isInheritedChange(): boolean;
_domId: number;
_cssClasses: Array<string>;