gesture.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. import Hammer from 'hammerjs';
  2. import { deepMix, addEventListener, removeEventListener } from '../util/common';
  3. var defaultOptions = {
  4. useCalculate: true,
  5. useOffset: false
  6. };
  7. class GestureController {
  8. constructor(_ref) {
  9. var {
  10. dom,
  11. gesture,
  12. options,
  13. chart,
  14. hammerOptions
  15. } = _ref;
  16. this.Hammer = Hammer;
  17. this.hammer = new Hammer(dom, hammerOptions);
  18. this.dom = dom;
  19. this.gesture = gesture;
  20. this.options = deepMix({}, defaultOptions, options);
  21. this.hammerOptions = hammerOptions;
  22. this.chart = chart;
  23. this._unbindEvent = {};
  24. if (!options) {
  25. this.hammerOptionsHack(gesture, this.hammer);
  26. }
  27. }
  28. hammerOptionsHack(gesture, hammer) {
  29. for (var key in gesture) {
  30. if (key.indexOf('swipe') !== -1 && hammer.get('swipe')) {
  31. hammer.get('swipe').set({
  32. enable: true
  33. });
  34. }
  35. if (key.indexOf('pinch') !== -1 && hammer.get('pinch')) {
  36. hammer.get('pinch').set({
  37. enable: true
  38. });
  39. }
  40. }
  41. }
  42. bindEvents() {
  43. var _this = this;
  44. var {
  45. gesture,
  46. hammer,
  47. dom
  48. } = this;
  49. var {
  50. useCalculate
  51. } = this.options;
  52. if (!hammer) {
  53. return;
  54. }
  55. var _loop = function _loop(key) {
  56. if (['touchstart', 'touchmove', 'touchend'].indexOf(key) !== -1) {
  57. var bindEvent = function bindEvent(event) {
  58. var records = useCalculate ? _this.getEventPositionRecords(event, true) : null;
  59. gesture[key](records, event);
  60. };
  61. addEventListener(dom, key, bindEvent);
  62. _this._unbindEvent[key] = bindEvent;
  63. } else {
  64. hammer.on(key, function (event) {
  65. var records = useCalculate ? _this.getEventPositionRecords(event, false) : null;
  66. gesture[key](records, event);
  67. });
  68. }
  69. };
  70. for (var key in gesture) {
  71. _loop(key);
  72. }
  73. }
  74. getEventPositionRecords(event, _isOrigin) {
  75. var {
  76. useOffset
  77. } = this.options;
  78. var canvasDom = this.chart.get('canvas').get('el');
  79. var x;
  80. var y;
  81. if (_isOrigin) {
  82. var positionSource = event.targetTouches.length > 0 ? event.targetTouches[0] : event.changedTouches[0];
  83. if (useOffset) {
  84. x = positionSource.clientX - canvasDom.offsetLeft;
  85. y = positionSource.clientY - canvasDom.offsetTop;
  86. } else {
  87. x = positionSource.clientX;
  88. y = positionSource.clientY;
  89. }
  90. } else {
  91. if (useOffset) {
  92. x = event.center.x - canvasDom.offsetLeft;
  93. y = event.center.y - canvasDom.offsetTop;
  94. } else {
  95. x = event.center.x;
  96. y = event.center.y;
  97. }
  98. }
  99. return this.chart.getSnapRecords({
  100. x,
  101. y
  102. });
  103. }
  104. destroy() {
  105. this.hammer.destroy();
  106. for (var key in this._unbindEvent) {
  107. var event = this._unbindEvent[key];
  108. removeEventListener(this.dom, key, event);
  109. }
  110. }
  111. }
  112. function init(chart) {
  113. chart.pluginGesture = function (_ref2) {
  114. var {
  115. gesture,
  116. options,
  117. hammerOptions
  118. } = _ref2;
  119. var canvasDom = chart.get('canvas').get('el');
  120. var gestureController = new GestureController({
  121. dom: canvasDom,
  122. gesture,
  123. options,
  124. hammerOptions,
  125. chart
  126. });
  127. gestureController.bindEvents();
  128. chart.set('gestureController', gestureController);
  129. return gestureController;
  130. };
  131. }
  132. function clear(chart) {
  133. var gestureController = chart.get('gestureController');
  134. gestureController && gestureController.destroy();
  135. }
  136. export { init, clear };