| /** |
| * Only implements needed gestures for mobile. |
| */ |
| import * as eventUtil from './event'; |
| |
| 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. |
| |
| }; |
| export default GestureMgr; |