mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-11-05 13:26:48 +08:00
Refactored gestures to support more scenarios in android.
This commit is contained in:
@@ -132,7 +132,7 @@ export class View extends proxy.ProxyObject implements definition.View {
|
||||
|
||||
public _cssClasses: Array<string> = [];
|
||||
|
||||
private _gesturesObserver: gestures.GesturesObserver;
|
||||
public _gestureObservers = {};
|
||||
private _updatingInheritedProperties: boolean;
|
||||
|
||||
public _options: definition.Options;
|
||||
@@ -147,9 +147,22 @@ export class View extends proxy.ProxyObject implements definition.View {
|
||||
this._visualState = visualStateConstants.Normal;
|
||||
}
|
||||
|
||||
observe(type: number, callback: (args: gestures.GestureEventData) => void, thisArg?: any): gestures.GesturesObserver {
|
||||
this._gesturesObserver = gestures.observe(this, type, callback, thisArg);
|
||||
return this._gesturesObserver;
|
||||
observe(type: number, callback: (args: gestures.GestureEventData) => void, thisArg?: any): void {
|
||||
var gesturesList = this._getGesturesList(type, true);
|
||||
gesturesList.push(gestures.observe(this, type, callback, thisArg));
|
||||
}
|
||||
|
||||
private _getGesturesList(gestureType: number, createIfNeeded): Array<gestures.GesturesObserver> {
|
||||
if (!gestureType) {
|
||||
throw new Error("GestureType must be a valid gesture!");
|
||||
}
|
||||
|
||||
var list = this._gestureObservers[gestureType];
|
||||
if (!list && createIfNeeded) {
|
||||
list = [];
|
||||
this._gestureObservers[gestureType] = list;
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
getViewById<T extends View>(id: string): T {
|
||||
|
||||
@@ -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);
|
||||
|
||||
2
ui/core/view.d.ts
vendored
2
ui/core/view.d.ts
vendored
@@ -355,7 +355,7 @@ declare module "ui/core/view" {
|
||||
*/
|
||||
public focus(): boolean;
|
||||
|
||||
observe(type: number, callback: (args: gestures.GestureEventData) => void, thisArg?: any): gestures.GesturesObserver;
|
||||
observe(type: number, callback: (args: gestures.GestureEventData) => void, thisArg?: any);
|
||||
|
||||
/**
|
||||
* A basic method signature to hook an event listener (shortcut alias to the addEventListener method).
|
||||
|
||||
Reference in New Issue
Block a user