組件代碼:
package UIEngine {
import laya.components.Script;
import laya.display.Sprite;
import laya.events.Event;
import laya.utils.Browser;
import laya.utils.Handler;
public class LongPress extends Script {
/** @prop {name:longpressTime, tips:"長(zhǎng)按時(shí)間", type:Int, default:500}*/
/** @prop {name:isOnceFlag, tips:"是否只觸發(fā)一次長(zhǎng)按", type:Boolean, default:True}*/
public var longpressTime: int = 500;
public var isMouseDown:Boolean = false;//是否鼠標(biāo)按下
public var lastMouseDownTime:int = 0;//上次鼠標(biāo)按下時(shí)間
public var isOnceFlag:Boolean = true;//是否只觸發(fā)一次長(zhǎng)按
private var _longPressHandler:Handler;
private var _clickHandler:Handler;
private var _longPressTriggleTime:int = 100;//長(zhǎng)按時(shí)間統(tǒng)計(jì)變量,初始值給跟間隔一樣,這樣只要長(zhǎng)按后就會(huì)立馬觸發(fā)一次
private var _longPressIntervalTime:int = 100;//判定長(zhǎng)按后 每100ms觸發(fā)一次clickhander
public static var _stop:Boolean = false;
private var target:*;
public function get clickHandler():Handler
{
return _clickHandler;
}
public function set clickHandler(value:Handler):void
{
_clickHandler = value;
}
public function get longPressHandler():Handler
{
return _longPressHandler;
}
public function set longPressHandler(value:Handler):void
{
_longPressHandler = value;
}
public var ownerSprite:*
override public function onEnable():void {
ownerSprite = this.owner
ownerSprite.on(Event.MOUSE_DOWN,this,onMouseDown)
}
override public function onDisable():void {
_clickHandler = longPressHandler = null
}
override public function onMouseDown(e:Event):void
{
LongPress._stop = false;
this.target = e;
isMouseDown = true
lastMouseDownTime = Browser.now()
ownerSprite.on(Event.MOUSE_UP,this,onMouseUp)
ownerSprite.on(Event.MOUSE_OUT,this,onMouseOut)
}
override public function onMouseUp(e:Event):void
{
isMouseDown = false
_clickHandler && _clickHandler.runWith(e)
this.target = null;
}
override public function onMouseOut(e:Event):void
{
isMouseDown = false
ownerSprite.off(Event.MOUSE_UP,this,onMouseUp)
ownerSprite.off(Event.MOUSE_OUT,this,onMouseOut)
this.target = null
}
override public function onUpdate():void
{
if(LongPress._stop && this.target){
LongPress._stop = false
this.onMouseOut(this.target);
return;
}
if(isMouseDown && Browser.now()-lastMouseDownTime>longpressTime)
{
if(_longPressTriggleTime>=_longPressIntervalTime)
{
if(isOnceFlag){
cancelLongPress();
}
_longPressHandler && _longPressHandler.run();
_longPressTriggleTime=0;
}
else
{
_longPressTriggleTime += Laya.timer.delta;
}
}
}
//常用腳本組件盡量重寫(xiě)reset方法 可以在destroy后自動(dòng)回收到對(duì)象池
public override function onReset():void
{
lastMouseDownTime=0;
isMouseDown=false;
longpressTime=500;
if(_longPressHandler)
{
_longPressHandler.recover();
_longPressHandler=null;
}
if(_clickHandler)
{
_clickHandler.recover();
_clickHandler=null;
}
}
//當(dāng)條件不滿(mǎn)足時(shí),要取消長(zhǎng)按事件
public function cancelLongPress():void
{
isMouseDown = false
ownerSprite.off(Event.MOUSE_UP,this,onMouseUp)
ownerSprite.off(Event.MOUSE_OUT,this,onMouseOut)
}
}
}
頁(yè)面使用:
//長(zhǎng)按需求
var _compLongPress:LongPress = m_sendBtn.addComponent(LongPress);
_compLongPress.isOnceFlag=false;
_compLongPress.longPressHandler = Handler.create(this,onSendClick,[true],false);
_compLongPress.clickHandler = Handler.create(this,onSendClick,[false],false);//Handler的釋放放到了comp 底層ondisable里面會(huì)清空跟該節(jié)點(diǎn)相關(guān)的所有handler