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]);
|
||
});
|
||
}
|
||
} |