美文网首页
LayaBox:按钮长按组件

LayaBox:按钮长按组件

作者: 一眼就认出你 | 来源:发表于2020-10-13 10:18 被阅读0次

    组件代码:

    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:"长按时间", type:Int, default:500}*/
            /** @prop {name:isOnceFlag, tips:"是否只触发一次长按", type:Boolean, default:True}*/
            public var longpressTime: int = 500;
            public var isMouseDown:Boolean = false;//是否鼠标按下
            public var lastMouseDownTime:int = 0;//上次鼠标按下时间
            public var isOnceFlag:Boolean = true;//是否只触发一次长按
            private var _longPressHandler:Handler;
            private var _clickHandler:Handler;
            
            private var _longPressTriggleTime:int = 100;//长按时间统计变量,初始值给跟间隔一样,这样只要长按后就会立马触发一次
            private var _longPressIntervalTime:int = 100;//判定长按后 每100ms触发一次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;
                    }
                }
            }
            
            //常用脚本组件尽量重写reset方法 可以在destroy后自动回收到对象池
            public override function onReset():void
            {
                lastMouseDownTime=0;
                isMouseDown=false;
                longpressTime=500;
                if(_longPressHandler)
                {
                    _longPressHandler.recover();
                    _longPressHandler=null;
                }
                if(_clickHandler)
                {
                    _clickHandler.recover();
                    _clickHandler=null;
                }
            }
            
            //当条件不满足时,要取消长按事件
            public function cancelLongPress():void
            {
                isMouseDown = false
                ownerSprite.off(Event.MOUSE_UP,this,onMouseUp)
                ownerSprite.off(Event.MOUSE_OUT,this,onMouseOut)
            }
            
        }
    }
    

    页面使用:

    //长按需求
    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里面会清空跟该节点相关的所有handler
    

    相关文章

      网友评论

          本文标题:LayaBox:按钮长按组件

          本文链接:https://www.haomeiwen.com/subject/skorjktx.html