Refactored gestures to support more scenarios in android.

This commit is contained in:
Nedyalko Nikolov
2015-05-26 10:25:42 +03:00
parent 0cb70233f0
commit f838f11844
9 changed files with 144 additions and 73 deletions

View File

@@ -4,6 +4,7 @@ import trace = require("trace");
import utils = require("utils/utils");
import dependencyObservable = require("ui/core/dependency-observable");
import proxy = require("ui/core/proxy");
import gestures = require("ui/gestures");
// merge the exports of the common file with the exports of this file
declare var exports;
@@ -77,6 +78,81 @@ export class View extends viewCommon.View {
this._updateOnTouchListener(this.isUserInteractionEnabled);
}
public onLoaded() {
super.onLoaded();
this.setOnTouchListener();
}
public onUnloaded() {
super.onUnloaded();
if (this.android && this.android.setOnTouchListener) {
this.android.setOnTouchListener(null);
}
}
private setOnTouchListener() {
if (this.android && this.android.setOnTouchListener && Object.keys(this._gestureObservers).length > 0) {
var that = new WeakRef(this);
if (this.android.setClickable) {
this.android.setClickable(true);
}
this.android.setOnTouchListener(new android.view.View.OnTouchListener({
onTouch: function (view: android.view.View, motionEvent: android.view.MotionEvent) {
var owner = that.get();
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);
}
}
}
}
}
return owner.android.onTouchEvent(motionEvent);
}
}));
}
}
public _addViewCore(view: viewCommon.View) {
if (this._context) {
view._onAttached(this._context);