move.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. "use strict";
  2. exports.__esModule = true;
  3. exports._handleMove = _handleMove;
  4. exports._doMove = _doMove;
  5. exports._handleLinearScale = _handleLinearScale;
  6. exports._handleCatScale = _handleCatScale;
  7. exports["default"] = void 0;
  8. var _common = require("../../util/common");
  9. var _helper = require("../helper");
  10. var _scale = require("../../scale");
  11. var TOUCH_EVENTS = ['touchstart', 'touchmove', 'touchend', 'touchStart', 'touchMove', 'touchEnd'];
  12. var DAY_TIMESTAMPS = 86400000;
  13. function _handleMove(e) {
  14. if (e.type === 'swipe' && e.deltaTime > 350) {
  15. // 区分 pan 操作和 swipe 操作
  16. return null;
  17. }
  18. var currentDeltaX = this.currentDeltaX,
  19. currentDeltaY = this.currentDeltaY,
  20. lastPoint = this.lastPoint;
  21. var deltaX;
  22. var deltaY;
  23. if (TOUCH_EVENTS.indexOf(e.type) !== -1) {
  24. // support touch and miniprogram
  25. var currentPoint = e.touches[0];
  26. deltaX = currentPoint.x - lastPoint.x;
  27. deltaY = currentPoint.y - lastPoint.y;
  28. this.lastPoint = currentPoint;
  29. } else if (currentDeltaX !== null && currentDeltaY !== null) {
  30. deltaX = e.deltaX - currentDeltaX;
  31. deltaY = e.deltaY - currentDeltaY;
  32. this.currentDeltaX = e.deltaX;
  33. this.currentDeltaY = e.deltaY;
  34. }
  35. if (Math.abs(deltaX) > 0 || Math.abs(deltaY) > 0) {
  36. var lastTimestamp = this._timestamp;
  37. var now = +new Date();
  38. if (now - lastTimestamp > 16) {
  39. this._doMove(deltaX, deltaY);
  40. this._timestamp = now;
  41. }
  42. }
  43. }
  44. function _doMove(deltaX, deltaY) {
  45. var self = this;
  46. var mode = self.mode,
  47. chart = self.chart,
  48. limitRange = self.limitRange;
  49. var coord = chart.get('coord');
  50. var start = coord.start,
  51. end = coord.end;
  52. var data = chart.get('data');
  53. if ((0, _common.directionEnabled)(mode, 'x') && deltaX !== 0) {
  54. var xScale = chart.getXScale();
  55. var xField = xScale.field;
  56. if (!limitRange[xField]) {
  57. limitRange[xField] = (0, _helper.getLimitRange)(data, xScale);
  58. }
  59. var coordWidth = end.x - start.x;
  60. if (xScale.isCategory) {
  61. self._handleCatScale(xScale, deltaX, coordWidth);
  62. } else if (xScale.isLinear) {
  63. self._handleLinearScale(xScale, deltaX, coordWidth, 'x');
  64. }
  65. self.xRange = (0, _helper.getFieldRange)(xScale, limitRange[xField], xScale.type);
  66. }
  67. if ((0, _common.directionEnabled)(mode, 'y') && deltaY !== 0) {
  68. var coordHeight = start.y - end.y;
  69. var yScales = chart.getYScales();
  70. (0, _common.each)(yScales, function (yScale) {
  71. var yField = yScale.field;
  72. if (!limitRange[yField]) {
  73. limitRange[yField] = (0, _helper.getLimitRange)(data, yScale);
  74. }
  75. yScale.isLinear && self._handleLinearScale(yScale, deltaY, coordHeight, 'y');
  76. });
  77. var scale = yScales[0];
  78. self.yRange = (0, _helper.getFieldRange)(scale, limitRange[scale.field], scale.type);
  79. }
  80. chart.repaint();
  81. }
  82. function _handleLinearScale(scale, delta, range, flag) {
  83. var field = scale.field,
  84. min = scale.min,
  85. max = scale.max;
  86. var limitRange = this.limitRange;
  87. if (min === limitRange[field].min && max === limitRange[field].max) return;
  88. var ratio = delta / range;
  89. var panValue = ratio * (max - min);
  90. var newMax = flag === 'x' ? max - panValue : max + panValue;
  91. var newMin = flag === 'x' ? min - panValue : min + panValue;
  92. if (limitRange[field] && !(0, _common.isNil)(limitRange[field].min) && newMin <= limitRange[field].min) {
  93. newMin = limitRange[field].min;
  94. newMax = max - min + newMin;
  95. }
  96. if (limitRange[field] && !(0, _common.isNil)(limitRange[field].max) && newMax >= limitRange[field].max) {
  97. newMax = limitRange[field].max;
  98. newMin = newMax - (max - min);
  99. }
  100. this.updateLinearScale(field, newMin, newMax);
  101. }
  102. function _handleCatScale(scale, delta, range) {
  103. var type = scale.type,
  104. field = scale.field,
  105. values = scale.values,
  106. ticks = scale.ticks,
  107. tickCount = scale.tickCount;
  108. var duplicateRemovalValues = (0, _common.uniq)(values);
  109. var originValues = this.limitRange[field];
  110. var lastValueIndex = originValues.length - 1;
  111. var currentLength = duplicateRemovalValues.length;
  112. var speed = this.speed || 1;
  113. var step = range / (currentLength * speed);
  114. var firstIndex = originValues.indexOf(duplicateRemovalValues[0]);
  115. var lastIndex = originValues.indexOf(duplicateRemovalValues[currentLength - 1]);
  116. var minIndex = firstIndex;
  117. var maxIndex = lastIndex;
  118. var ratio = Math.abs(delta / range);
  119. var panStep = this.step || Math.max(1, parseInt(ratio * currentLength));
  120. this._panCumulativeDelta += delta;
  121. minIndex = this._panCumulativeDelta > step ? Math.max(0, minIndex - panStep) : this._panCumulativeDelta < -step ? Math.min(lastValueIndex - currentLength + 1, minIndex + panStep) : minIndex;
  122. maxIndex = Math.min(lastValueIndex, minIndex + currentLength - 1);
  123. if (minIndex === firstIndex && maxIndex === lastIndex) {
  124. return null;
  125. }
  126. var newValues = originValues.slice(minIndex, maxIndex + 1);
  127. var newTicks = null;
  128. if (type === 'timeCat') {
  129. var tickGap = ticks.length > 2 ? ticks[1] - ticks[0] : DAY_TIMESTAMPS;
  130. if (this._panCumulativeDelta > step) {
  131. for (var i = ticks[0] - tickGap; i >= newValues[0]; i -= tickGap) {
  132. ticks.unshift(i);
  133. }
  134. } else if (this._panCumulativeDelta < -step) {
  135. for (var _i = ticks[ticks.length - 1] + tickGap; _i <= newValues[newValues.length - 1]; _i += tickGap) {
  136. ticks.push(_i);
  137. }
  138. }
  139. newTicks = ticks;
  140. } else if (type === 'cat') {
  141. var catTicks = (0, _scale.getTickMethod)('cat');
  142. newTicks = catTicks({
  143. tickCount: tickCount,
  144. values: newValues
  145. });
  146. } else {
  147. // 保留之前的ticks
  148. newTicks = ticks;
  149. }
  150. this.updateCatScale(field, newValues, newTicks, originValues, minIndex, maxIndex);
  151. this._panCumulativeDelta = minIndex !== firstIndex ? 0 : this._panCumulativeDelta;
  152. }
  153. var _default = {
  154. _handleMove: _handleMove,
  155. _doMove: _doMove,
  156. _handleLinearScale: _handleLinearScale,
  157. _handleCatScale: _handleCatScale
  158. };
  159. exports["default"] = _default;