Skip to content

Commit 45ae20a

Browse files
committed
fix: drag of zoomable should not be triggered when has multiple pointers
1 parent 3614203 commit 45ae20a

File tree

5 files changed

+23
-23
lines changed

5 files changed

+23
-23
lines changed

packages/vchart/src/component/common/trigger/desktop.ts

-5
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
import type { IZoomTrigger } from './interface';
22

33
export class DeskTopTrigger implements IZoomTrigger {
4-
pointerId: number;
5-
64
parserScrollEvent(e: any) {
75
if (!e) {
86
return e;
@@ -40,7 +38,4 @@ export class DeskTopTrigger implements IZoomTrigger {
4038
clearDrag(): void {
4139
// do nothing
4240
}
43-
parserDragEvent(): boolean {
44-
return true;
45-
}
4641
}

packages/vchart/src/component/common/trigger/interface.ts

-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
export interface IZoomTrigger {
2-
pointerId: number;
32
parserZoomEvent: (e: any) => any;
4-
parserDragEvent: (event: any) => boolean;
53
parserScrollEvent: (event: any) => any;
64
clearZoom: () => void;
75
clearScroll: () => void;

packages/vchart/src/component/common/trigger/mobile.ts

+10-12
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,21 @@
11
import type { IZoomTrigger } from './interface';
22
export class MobileTrigger implements IZoomTrigger {
33
private _lastScale = 0;
4-
pointerId: number;
54

65
clearZoom(): void {
76
this._lastScale = 0;
8-
this.pointerId = null;
97
}
108

11-
parserDragEvent(event: any): boolean {
12-
// 下面的代码逻辑本意是:单指(pointerId===0) -> 多指(pointerId === 1) 切换后, 终止touch事件
13-
// 问题:ios系统/部分MIUI系统,单指/多指滑动过程中, pointerId每次都不一样,所以无法做到上述识别
14-
// 解决方法: 暂时不做流程判断, 如果后续有需求, 单指 -> 多指可以考虑用event.isPrimary判断
15-
// if (this.pointerId) {
16-
// return this.pointerId === event.pointerId;
17-
// }
18-
// this.pointerId = event.pointerId;
19-
return true;
20-
}
9+
// parserDragEvent(event: any): boolean {
10+
// // 下面的代码逻辑本意是:单指(pointerId===0) -> 多指(pointerId === 1) 切换后, 终止touch事件
11+
// // 问题:ios系统/部分MIUI系统,单指/多指滑动过程中, pointerId每次都不一样,所以无法做到上述识别
12+
// // 解决方法: 暂时不做流程判断, 如果后续有需求, 单指 -> 多指可以考虑用event.isPrimary判断
13+
// // if (this.pointerId) {
14+
// // return this.pointerId === event.pointerId;
15+
// // }
16+
// // this.pointerId = event.pointerId;
17+
// return true;
18+
// }
2119

2220
parserZoomEvent(event: any) {
2321
const scale = event.scale;

packages/vchart/src/component/data-zoom/data-filter-base-component.ts

-1
Original file line numberDiff line numberDiff line change
@@ -880,7 +880,6 @@ export abstract class DataFilterBaseComponent<T extends IDataFilterComponentSpec
880880
if (this._dragAttr.reverse) {
881881
value = -value;
882882
}
883-
884883
this._handleChartMove(value, this._dragAttr.rate ?? 1);
885884
};
886885

packages/vchart/src/interaction/zoom/zoomable.ts

+13-3
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,16 @@ export class Zoomable implements IZoomable {
475475
}
476476
}
477477

478+
private isDragEnable(event: any) {
479+
if (this._isGestureListener && this._gestureController) {
480+
const events = (this._gestureController as any).cachedEvents;
481+
482+
return !events || events.length < 2;
483+
}
484+
485+
return true;
486+
}
487+
478488
protected _handleDrag(
479489
params: ExtendEventParam,
480490
callback?: (delta: [number, number], e: BaseEventParams['event']) => void,
@@ -485,7 +495,8 @@ export class Zoomable implements IZoomable {
485495
return;
486496
}
487497
this._clickEnable = false;
488-
if (!this._zoomableTrigger.parserDragEvent(params.event)) {
498+
499+
if (!this.isDragEnable(params.event)) {
489500
return;
490501
}
491502
this._zoomableTrigger.clearZoom(); // 防止zoom 事件被同时触发, 状态混乱
@@ -519,12 +530,11 @@ export class Zoomable implements IZoomable {
519530
delta,
520531
model: this
521532
} as unknown as BaseEventParams);
522-
this._zoomableTrigger.pointerId = null;
523533
this._clearDragEvent();
524534
}, delayTime);
525535

526536
this._handleDragMouseMove = delayMap[delayType]((params: ExtendEventParam) => {
527-
if (!this._zoomableTrigger.parserDragEvent(params.event)) {
537+
if (!this.isDragEnable(params.event)) {
528538
return;
529539
}
530540
this._clickEnable = false;

0 commit comments

Comments
 (0)