base.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. /**
  2. * The parent class of interaction
  3. * @author sima.zhang1990@gmail.com
  4. */
  5. import './register';
  6. const Util = require('../util/common');
  7. let Hammer;
  8. if (!Util.isWx && !Util.isMy) {
  9. Hammer = require('hammerjs');
  10. }
  11. const TOUCH_EVENTS = [
  12. 'touchstart',
  13. 'touchmove',
  14. 'touchend'
  15. ];
  16. class Interaction {
  17. getDefaultCfg() {
  18. return {
  19. startEvent: TOUCH_EVENTS[0],
  20. processEvent: TOUCH_EVENTS[1],
  21. endEvent: TOUCH_EVENTS[2],
  22. resetEvent: null
  23. };
  24. }
  25. _start = ev => {
  26. this.preStart && this.preStart(ev);
  27. this.start(ev);
  28. this.onStart && this.onStart(ev);
  29. }
  30. _process = ev => {
  31. this.preProcess && this.preProcess(ev);
  32. this.process(ev);
  33. this.onProcess && this.onProcess(ev);
  34. }
  35. _end = ev => {
  36. this.preEnd && this.preEnd(ev);
  37. this.end(ev);
  38. this.onEnd && this.onEnd(ev);
  39. }
  40. _reset = ev => {
  41. this.preReset && this.preReset(ev);
  42. this.reset(ev);
  43. this.onReset && this.onReset(ev);
  44. }
  45. // override
  46. start() {}
  47. // override
  48. process() {}
  49. // override
  50. end() {}
  51. // override
  52. reset() {}
  53. constructor(cfg, chart) {
  54. const defaultCfg = this.getDefaultCfg();
  55. Util.deepMix(this, defaultCfg, cfg);
  56. this.chart = chart;
  57. this.canvas = chart.get('canvas');
  58. this.el = chart.get('canvas').get('el');
  59. this._bindEvents();
  60. }
  61. _bindEvents() {
  62. this._clearEvents(); // clear events
  63. const { startEvent, processEvent, endEvent, resetEvent, el } = this;
  64. if (Hammer) {
  65. this.hammer = new Hammer(el);
  66. }
  67. this._bindEvent(startEvent, this._start);
  68. this._bindEvent(processEvent, this._process);
  69. this._bindEvent(endEvent, this._end);
  70. this._bindEvent(resetEvent, this._reset);
  71. }
  72. _clearEvents() {
  73. const { startEvent, processEvent, endEvent, resetEvent } = this;
  74. if (this.hammer) {
  75. this.hammer.destroy();
  76. this.hammer = null;
  77. }
  78. this._clearTouchEvent(startEvent, this._start);
  79. this._clearTouchEvent(processEvent, this._process);
  80. this._clearTouchEvent(endEvent, this._end);
  81. this._clearTouchEvent(resetEvent, this._reset);
  82. }
  83. _bindEvent(eventName, method) {
  84. const el = this.el;
  85. if (eventName) {
  86. if (TOUCH_EVENTS.indexOf(eventName) !== -1) {
  87. Util.addEventListener(el, eventName, method);
  88. } else if (this.hammer) {
  89. this.hammer.on(eventName, method);
  90. }
  91. }
  92. }
  93. _clearTouchEvent(eventName, method) {
  94. const el = this.el;
  95. if (eventName && TOUCH_EVENTS.indexOf(eventName) !== -1) {
  96. Util.removeEventListener(el, eventName, method);
  97. }
  98. }
  99. destroy() {
  100. this._clearEvents();
  101. }
  102. }
  103. module.exports = Interaction;