制作不易,有什么问题可以提出来,我来改进,谢谢大家。
长按功能分为,1.监听方式和2.触发方式两个要点
首先我们要确定
1.长按时长 _curTime
2.触发长按时长 longpressTime
3.长按抬起函数 TouchContinueCallBack
4.抬起回调. TouchCallBack
/** * 长按事件监听(兼容单击) * @param GObject 需要注册的控件 * @param longpressTime 长按判定时间 默认500ms * @param intervalTime 计时器间隔事件 默认100ms * @param TouchCallBack 抬起回调 * @param TouchContinueCallBack 长按持续回调 */ public static LongPress(This,GObject:fairygui.GObject,longpressTime = 0, intervalTime:number = 0, TouchCallBack:Function = null, TouchContinueCallBack:Function = null){ let _This = This; let _isLongPress = false; let _isMoveDown = false; // 是否鼠标按下 let _longpressTime = longpressTime?longpressTime:500; // 长按判定时间 let _intervalTime = intervalTime?intervalTime:100; // 计时器间隔时间 let _curTime = 0; // 计时器计时长按速度 if(!GObject){ LogUtils.log(null, "longPress - GObject is undefined "); } let _TouchCallBack = TouchCallBack; let _TouchContinueCallBack = TouchContinueCallBack; GObject.on(Laya.Event.MOUSE_DOWN, this,()=>{ LogUtils.log(null, "LongPress Laya.Event.MOUSE_DOWN"); _isMoveDown = true; //计时器 Laya.timer.loop(_intervalTime, this, downTimeFun); }); function downTimeFun(){ _curTime+=_intervalTime; if(_curTime >= _longpressTime){ loopSendCallBack(); } } function loopSendCallBack() { //此处可改变不同的长按触发函数方式 例如使用二次贝塞尔曲线 if(_TouchContinueCallBack){ _TouchContinueCallBack(_This); LogUtils.log(null, "TouchContinueCallBack Function"); return; } LogUtils.log(null, "not TouchContinueCallBack Function"); } GObject.on(Laya.Event.MOUSE_UP, this,()=>{ LogUtils.log(null, "LongPress Laya.Event.MOUSE_UP"); if(_isMoveDown){ Laya.timer.clear(this,downTimeFun); } _curTime = 0; _isLongPress = false; _isMoveDown = false; if(_TouchCallBack){ LogUtils.log(null, "LongPress-TouchCallBack Function"); _TouchCallBack(_This); return; }else{ LogUtils.log(null, "not LongPress-TouchCallBack Function"); } }); }