90 lines
2.9 KiB
TypeScript
90 lines
2.9 KiB
TypeScript
|
const { ccclass, property } = cc._decorator;
|
|||
|
|
|||
|
@ccclass
|
|||
|
export default class LongTouchComponent extends cc.Component {
|
|||
|
@property({
|
|||
|
tooltip: "触摸回调间隔(秒)。假如为0.1,那么1秒内会回调10次 ${longTouchEvents} 事件数组"
|
|||
|
})
|
|||
|
touchInterval: number = 0.1;
|
|||
|
|
|||
|
@property({
|
|||
|
type: [cc.Component.EventHandler],
|
|||
|
tooltip: "回调事件数组,每间隔 ${toucheInterval}s 回调一次"
|
|||
|
})
|
|||
|
longTouchEvents: cc.Component.EventHandler[] = [];
|
|||
|
|
|||
|
/**
|
|||
|
* 触摸计数器,用于统计本次长按的回调次数
|
|||
|
*/
|
|||
|
private _touchCounter: number = 0;
|
|||
|
|
|||
|
/**
|
|||
|
* 标记当前是否在触摸这个节点
|
|||
|
*/
|
|||
|
private _isTouching: boolean = false;
|
|||
|
|
|||
|
onEnable() {
|
|||
|
this.node.on(cc.Node.EventType.TOUCH_START, this._onTouchStart, this);
|
|||
|
this.node.on(cc.Node.EventType.TOUCH_END, this._onTouchEnd, this);
|
|||
|
this.node.on(cc.Node.EventType.TOUCH_CANCEL, this._onTouchCancel, this);
|
|||
|
}
|
|||
|
|
|||
|
onDisable() {
|
|||
|
this.node.off(cc.Node.EventType.TOUCH_START, this._onTouchStart, this);
|
|||
|
this.node.off(cc.Node.EventType.TOUCH_END, this._onTouchEnd, this);
|
|||
|
this.node.off(cc.Node.EventType.TOUCH_CANCEL, this._onTouchCancel, this);
|
|||
|
}
|
|||
|
|
|||
|
private _onTouchStart(event: cc.Event.EventTouch) {
|
|||
|
if (this._isTouching) {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (this.node.getBoundingBoxToWorld().contains(event.getLocation())) {
|
|||
|
this._isTouching = true;
|
|||
|
} else {
|
|||
|
this._isTouching = false;
|
|||
|
}
|
|||
|
|
|||
|
if (this._isTouching) {
|
|||
|
// 第一次触摸立即回调一次
|
|||
|
this.publishOneTouch();
|
|||
|
|
|||
|
// 然后开启计时器,计算后续的长按相当于触摸了多少次
|
|||
|
this.schedule(this._touchCounterCallback, this.touchInterval);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private _onTouchEnd(event: cc.Event.EventTouch) {
|
|||
|
this._isTouching = false;
|
|||
|
this._touchCounter = 0;
|
|||
|
this.unschedule(this._touchCounterCallback);
|
|||
|
}
|
|||
|
|
|||
|
private _onTouchCancel(event: cc.Event.EventTouch) {
|
|||
|
this._isTouching = false;
|
|||
|
this._touchCounter = 0;
|
|||
|
this.unschedule(this._touchCounterCallback);
|
|||
|
}
|
|||
|
|
|||
|
private _touchCounterCallback() {
|
|||
|
if (this._isTouching) {
|
|||
|
this.publishOneTouch();
|
|||
|
} else {
|
|||
|
this.unschedule(this._touchCounterCallback);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 通知出去:被点击/触摸了一次,长按时,会连续多次回调这个方法
|
|||
|
*/
|
|||
|
private publishOneTouch() {
|
|||
|
if (!this._isTouching) {
|
|||
|
return;
|
|||
|
}
|
|||
|
this._touchCounter++;
|
|||
|
this.longTouchEvents.forEach((eventHandler: cc.Component.EventHandler) => {
|
|||
|
eventHandler.emit([this._touchCounter]);
|
|||
|
});
|
|||
|
}
|
|||
|
}
|