123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- var eventUtil = require("./event");
- /**
- * Only implements needed gestures for mobile.
- */
- var GestureMgr = function () {
- /**
- * @private
- * @type {Array.<Object>}
- */
- this._track = [];
- };
- GestureMgr.prototype = {
- constructor: GestureMgr,
- recognize: function (event, target, root) {
- this._doTrack(event, target, root);
- return this._recognize(event);
- },
- clear: function () {
- this._track.length = 0;
- return this;
- },
- _doTrack: function (event, target, root) {
- var touches = event.touches;
- if (!touches) {
- return;
- }
- var trackItem = {
- points: [],
- touches: [],
- target: target,
- event: event
- };
- for (var i = 0, len = touches.length; i < len; i++) {
- var touch = touches[i];
- var pos = eventUtil.clientToLocal(root, touch, {});
- trackItem.points.push([pos.zrX, pos.zrY]);
- trackItem.touches.push(touch);
- }
- this._track.push(trackItem);
- },
- _recognize: function (event) {
- for (var eventName in recognizers) {
- if (recognizers.hasOwnProperty(eventName)) {
- var gestureInfo = recognizers[eventName](this._track, event);
- if (gestureInfo) {
- return gestureInfo;
- }
- }
- }
- }
- };
- function dist(pointPair) {
- var dx = pointPair[1][0] - pointPair[0][0];
- var dy = pointPair[1][1] - pointPair[0][1];
- return Math.sqrt(dx * dx + dy * dy);
- }
- function center(pointPair) {
- return [(pointPair[0][0] + pointPair[1][0]) / 2, (pointPair[0][1] + pointPair[1][1]) / 2];
- }
- var recognizers = {
- pinch: function (track, event) {
- var trackLen = track.length;
- if (!trackLen) {
- return;
- }
- var pinchEnd = (track[trackLen - 1] || {}).points;
- var pinchPre = (track[trackLen - 2] || {}).points || pinchEnd;
- if (pinchPre && pinchPre.length > 1 && pinchEnd && pinchEnd.length > 1) {
- var pinchScale = dist(pinchEnd) / dist(pinchPre);
- !isFinite(pinchScale) && (pinchScale = 1);
- event.pinchScale = pinchScale;
- var pinchCenter = center(pinchEnd);
- event.pinchX = pinchCenter[0];
- event.pinchY = pinchCenter[1];
- return {
- type: 'pinch',
- target: track[0].target,
- event: event
- };
- }
- } // Only pinch currently.
- };
- var _default = GestureMgr;
- module.exports = _default;
|