Blame view

node_modules/zrender/src/core/GestureMgr.js 2.61 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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
  /**
   * 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;