move.js 5.4 KB

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