UNPKG

react-native-gesture-handler

Version:

Experimental implementation of a new declarative API for gesture handling in react-native

226 lines (177 loc) 6.07 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _VelocityTracker = _interopRequireDefault(require("./VelocityTracker")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } const MAX_POINTERS = 20; class PointerTracker { constructor() { _defineProperty(this, "velocityTracker", new _VelocityTracker.default()); _defineProperty(this, "trackedPointers", new Map()); _defineProperty(this, "touchEventsIds", new Map()); _defineProperty(this, "lastMovedPointerId", void 0); _defineProperty(this, "cachedAverages", { x: 0, y: 0 }); this.lastMovedPointerId = NaN; for (let i = 0; i < MAX_POINTERS; ++i) { this.touchEventsIds.set(i, NaN); } } addToTracker(event) { if (this.trackedPointers.has(event.pointerId)) { return; } this.lastMovedPointerId = event.pointerId; const newElement = { lastX: event.x, lastY: event.y, timeStamp: event.time, velocityX: 0, velocityY: 0 }; this.trackedPointers.set(event.pointerId, newElement); this.mapTouchEventId(event.pointerId); this.cachedAverages = { x: this.getLastAvgX(), y: this.getLastAvgY() }; } removeFromTracker(pointerId) { this.trackedPointers.delete(pointerId); this.removeMappedTouchId(pointerId); } track(event) { const element = this.trackedPointers.get(event.pointerId); if (!element) { return; } this.lastMovedPointerId = event.pointerId; this.velocityTracker.add(event); const [velocityX, velocityY] = this.velocityTracker.getVelocity(); element.velocityX = velocityX; element.velocityY = velocityY; element.lastX = event.x; element.lastY = event.y; this.trackedPointers.set(event.pointerId, element); const avgX = this.getLastAvgX(); const avgY = this.getLastAvgY(); this.cachedAverages = { x: avgX, y: avgY }; } //Mapping TouchEvents ID mapTouchEventId(id) { for (const [mappedId, touchId] of this.touchEventsIds) { if (isNaN(touchId)) { this.touchEventsIds.set(mappedId, id); break; } } } removeMappedTouchId(id) { const mappedId = this.getMappedTouchEventId(id); if (!isNaN(mappedId)) { this.touchEventsIds.set(mappedId, NaN); } } getMappedTouchEventId(touchEventId) { for (const [key, value] of this.touchEventsIds.entries()) { if (value === touchEventId) { return key; } } return NaN; } getVelocityX(pointerId) { var _this$trackedPointers; return (_this$trackedPointers = this.trackedPointers.get(pointerId)) === null || _this$trackedPointers === void 0 ? void 0 : _this$trackedPointers.velocityX; } getVelocityY(pointerId) { var _this$trackedPointers2; return (_this$trackedPointers2 = this.trackedPointers.get(pointerId)) === null || _this$trackedPointers2 === void 0 ? void 0 : _this$trackedPointers2.velocityY; } /** * Returns X coordinate of last moved pointer */ getLastX(pointerId) { if (pointerId !== undefined) { var _this$trackedPointers3; return (_this$trackedPointers3 = this.trackedPointers.get(pointerId)) === null || _this$trackedPointers3 === void 0 ? void 0 : _this$trackedPointers3.lastX; } else { var _this$trackedPointers4; return (_this$trackedPointers4 = this.trackedPointers.get(this.lastMovedPointerId)) === null || _this$trackedPointers4 === void 0 ? void 0 : _this$trackedPointers4.lastX; } } /** * Returns Y coordinate of last moved pointer */ getLastY(pointerId) { if (pointerId !== undefined) { var _this$trackedPointers5; return (_this$trackedPointers5 = this.trackedPointers.get(pointerId)) === null || _this$trackedPointers5 === void 0 ? void 0 : _this$trackedPointers5.lastY; } else { var _this$trackedPointers6; return (_this$trackedPointers6 = this.trackedPointers.get(this.lastMovedPointerId)) === null || _this$trackedPointers6 === void 0 ? void 0 : _this$trackedPointers6.lastY; } } // Some handlers use these methods to send average values in native event. // This may happen when pointers have already been removed from tracker (i.e. pointerup event). // In situation when NaN would be sent as a response, we return cached value. // That prevents handlers from crashing getLastAvgX() { const avgX = this.getSumX() / this.trackedPointers.size; return isNaN(avgX) ? this.cachedAverages.x : avgX; } getLastAvgY() { const avgY = this.getSumY() / this.trackedPointers.size; return isNaN(avgY) ? this.cachedAverages.y : avgY; } getSumX(ignoredPointer) { let sumX = 0; this.trackedPointers.forEach((value, key) => { if (key !== ignoredPointer) { sumX += value.lastX; } }); return sumX; } getSumY(ignoredPointer) { let sumY = 0; this.trackedPointers.forEach((value, key) => { if (key !== ignoredPointer) { sumY += value.lastY; } }); return sumY; } getTrackedPointersCount() { return this.trackedPointers.size; } getTrackedPointersID() { const keys = []; this.trackedPointers.forEach((_value, key) => { keys.push(key); }); return keys; } getData() { return this.trackedPointers; } resetTracker() { this.velocityTracker.reset(); this.trackedPointers.clear(); this.lastMovedPointerId = NaN; for (let i = 0; i < MAX_POINTERS; ++i) { this.touchEventsIds.set(i, NaN); } } static shareCommonPointers(stPointers, ndPointers) { return stPointers.some(pointerId => ndPointers.includes(pointerId)); } } exports.default = PointerTracker; //# sourceMappingURL=PointerTracker.js.map