Skip to content

Commit aa057a8

Browse files
committed
fix(canvas): gesture handling
1 parent 77404ac commit aa057a8

File tree

3 files changed

+74
-3
lines changed

3 files changed

+74
-3
lines changed

packages/canvas/Canvas/common.ts

Lines changed: 68 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { CSSType, PercentLength, View, Screen, GestureStateTypes, Utils, Application } from '@nativescript/core';
22
import { CanvasRenderingContext, TouchList } from '../common';
3+
import { Pointer } from '@nativescript/core/ui/gestures';
34

45
export interface ICanvasBase {
56
on(eventName: 'ready', callback: (data: any) => void, thisArg?: any): void;
@@ -13,11 +14,18 @@ export abstract class CanvasBase extends View implements ICanvasBase {
1314

1415
protected constructor() {
1516
super();
16-
this._touchEvents = this._touchEventsFN.bind(this);
17-
this.on('touch, pan', this._touchEvents);
1817
this._classList = new Set();
1918
}
2019

20+
__handleGestures() {
21+
if (this._touchEvents) {
22+
this.off('touch, pan, pinch', this._touchEvents);
23+
this._touchEvents = undefined;
24+
}
25+
this._touchEvents = this._touchEventsFN.bind(this);
26+
this.on('touch, pan, pinch', this._touchEvents);
27+
}
28+
2129
_classList: Set<any>;
2230

2331
get classList() {
@@ -82,24 +90,31 @@ export abstract class CanvasBase extends View implements ICanvasBase {
8290
return null;
8391
}
8492

93+
__touchStart?: Pointer;
94+
8595
_touchEventsFN(event: any) {
8696
if (event.eventName === 'touch') {
8797
switch (event.action) {
8898
case 'down':
99+
this.__touchStart = event.getActivePointers()[0];
89100
this._emitEvent('touchstart', event);
90101
break;
91102
case 'up':
92103
this._emitEvent('touchend', event);
104+
this.__touchStart = undefined;
93105
break;
94106
case 'cancel':
95107
this._emitEvent('touchcancel', event);
108+
this.__touchStart = undefined;
96109
break;
97110
case 'move':
98111
// NOOP
99112
break;
100113
default:
101114
break;
102115
}
116+
} else if (event.eventName === 'pinch') {
117+
this._emitEvent('touchmove:pinch', event);
103118
} else if (event.eventName === 'pan') {
104119
if (event.state === GestureStateTypes.began || event.state === GestureStateTypes.changed) {
105120
this._emitEvent('touchmove', event);
@@ -110,8 +125,9 @@ export abstract class CanvasBase extends View implements ICanvasBase {
110125
_getTouchEvent(name, event, target) {
111126
const pointers = new TouchList();
112127
const scale = 1;
113-
let activePointer = {};
128+
let activePointer: {};
114129
if (name === 'touchmove') {
130+
name = 'touchmove';
115131
/* mouse */
116132
activePointer = {
117133
clientX: event.deltaX * scale,
@@ -144,6 +160,55 @@ export abstract class CanvasBase extends View implements ICanvasBase {
144160
screenY: event.deltaY * scale,
145161
target,
146162
});
163+
} else if (name === 'touchmove:pinch') {
164+
name = 'touchmove';
165+
const x = event.getFocusX();
166+
const y = event.getFocusY();
167+
const scale = event.scale;
168+
// mouse event
169+
activePointer = {
170+
clientX: x * scale,
171+
clientY: y * scale,
172+
force: 0.0,
173+
identifier: 0,
174+
pageX: x * scale,
175+
pageY: y * scale,
176+
radiusX: 0,
177+
radiusY: 0,
178+
rotationAngle: 0,
179+
screenX: x * scale,
180+
screenY: x * scale,
181+
};
182+
183+
pointers.push({
184+
clientX: this.__touchStart.getX(),
185+
clientY: this.__touchStart.getY(),
186+
force: 0.0,
187+
identifier: 0,
188+
pageX: this.__touchStart.getX(),
189+
pageY: this.__touchStart.getY(),
190+
radiusX: 0,
191+
radiusY: 0,
192+
rotationAngle: 0,
193+
screenX: this.__touchStart.getX(),
194+
screenY: this.__touchStart.getY(),
195+
target,
196+
});
197+
198+
pointers.push({
199+
clientX: x,
200+
clientY: y,
201+
force: 0.0,
202+
identifier: 1,
203+
pageX: x,
204+
pageY: y,
205+
radiusX: 0,
206+
radiusY: 0,
207+
rotationAngle: 0,
208+
screenX: x,
209+
screenY: y,
210+
target,
211+
});
147212
} else {
148213
const count = event.getAllPointers().length;
149214
const point = event.getActivePointers()[0];

packages/canvas/Canvas/index.android.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ export class Canvas extends CanvasBase {
9999
initNativeView(): void {
100100
super.initNativeView();
101101
const ref = new WeakRef(this);
102+
this.__handleGestures();
102103
this._canvas.setListener(
103104
new com.github.triniwiz.canvas.CanvasView.Listener({
104105
contextReady() {

packages/canvas/Canvas/index.ios.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,11 @@ export class Canvas extends CanvasBase {
134134
return this._canvas;
135135
}
136136

137+
initNativeView() {
138+
super.initNativeView();
139+
this.__handleGestures();
140+
}
141+
137142
flush() {
138143
if (this.ios) {
139144
this.ios.flush();

0 commit comments

Comments
 (0)