Skip to content

Commit

Permalink
fix: 识别器增加"正在等待"状态, 这样可以保证有识别器数组中的识别器的执行顺序不会被requireFailure的执行顺序颠倒
Browse files Browse the repository at this point in the history
  • Loading branch information
any86 committed Jul 8, 2019
1 parent 9e4eda9 commit 51efe81
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 21 deletions.
11 changes: 8 additions & 3 deletions src/recognitions/Base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,16 @@ export default abstract class Recognizer {

public eventEmitter: any;

public isWaitingOther: boolean;

constructor(options: { name?: string, [k: string]: any }) {
this.options = { ...(<any>this.constructor).DEFAULT_OPTIONS, disabled: false, ...options };
this.name = this.options.name;
this.disabled = this.options.disabled;
this.status = STATUS_POSSIBLE;
this.isRecognized = false;
this.requireFailureRecognizers = [];
this.isWaitingOther = false;
// 这里面不能直接调用$root等,
// 因为rollup生成的代码构造函数并不是该constructor
// 而是构造函数中又嵌套了一个同名构造函数
Expand Down Expand Up @@ -105,15 +108,17 @@ export default abstract class Recognizer {
/**
* 是否所有"需要失败"的手势都是disabled的
*/
public isAllRequireFailureRecognizersDisabled(){
return this.requireFailureRecognizers.every((recognizer:any)=>recognizer.disabled);
public isAllRequireFailureRecognizersDisabled() {
return this.requireFailureRecognizers.every((recognizer: any) => recognizer.disabled);
};

/**
* 是否要求注册时指定失败的选择器是失败状态
*/
public isAllRequiresFailedOrPossible(): boolean {
for (let recognizer of this.requireFailureRecognizers) {
// console.log(this.name, this.isWaitingOther)
if (recognizer.isWaitingOther) return false;
if (STATUS_FAILED !== recognizer.status && STATUS_POSSIBLE !== recognizer.status) {
return false;
}
Expand All @@ -125,7 +130,7 @@ export default abstract class Recognizer {
* @param {Number} 触点数
*/
public isValidPointLength(pointLength: number): boolean {
return 0 === this.options.pointLength || this.options.pointLength === pointLength
return 0 === this.options.pointLength || this.options.pointLength === pointLength;
};

/**
Expand Down
22 changes: 4 additions & 18 deletions src/recognitions/Tap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -133,13 +133,14 @@ export default class TapRecognizer extends Recognizer {
public recognize(computed: Computed): void {
// 只在end阶段去识别
if (INPUT_END !== computed.eventType) return;

this.status = STATUS_POSSIBLE;

// 每一次点击是否符合要求
if (this.test(computed)) {
clearTimeout(this._delayFailTimer);
clearTimeout(this._waitOtherFailedTimer);
this.isWaitingOther = false;
// 判断2次点击之间的距离是否过大
// 对符合要求的点击进行累加
if (this._isValidDistanceFromPrevTap(computed) && this._isValidInterval()) {
Expand All @@ -155,6 +156,7 @@ export default class TapRecognizer extends Recognizer {
// 之所以用%, 是因为如果连续点击3次, 单击的tapCount会为3, 但是其实tap也应该触发
if (0 === this.tapCount % this.options.tapTimes) {
if (this.hasRequireFailure() && !this.isAllRequireFailureRecognizersDisabled()) {
this.isWaitingOther = true;
this._waitOtherFailedTimer = setTimeout(() => {
// 检查指定手势是否识别为Failed
if (this.isAllRequiresFailedOrPossible()) {
Expand All @@ -163,6 +165,7 @@ export default class TapRecognizer extends Recognizer {
} else {
this.status = STATUS_FAILED;
};
this.isWaitingOther = false;
// 不论成功失败都要重置tap计数
}, this.options.waitNextTapTime);
}
Expand Down Expand Up @@ -191,23 +194,6 @@ export default class TapRecognizer extends Recognizer {
this.prevTapTime = undefined;
};

/**
* 指定时间后, 设置状态为失败
*/
private _delayFail(cb: () => void = () => { }) {
this._delayFailTimer = setTimeout(() => {
this.status = STATUS_FAILED;
cb();
}, this.options.waitNextTapTime);
};

/**
* 取消延迟失败定时
*/
private _cancelDelayFail() {
clearTimeout(this._delayFailTimer);
};

/**
* 识别条件
* @param {Computed} 计算数据
Expand Down

0 comments on commit 51efe81

Please sign in to comment.