Blame view

node_modules/zrender/lib/core/GestureMgr.js 2.26 KB
aaac7fed   liuqimichale   add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
  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;