加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Flash AS3 显示对象对鼠标单击,双击,拖拽事件的处理

发布时间:2020-12-15 18:07:27 所属栏目:百科 来源:网络整理
导读:AS3.0 增加了对鼠标事件DOUBLE_CLICK的支持,AS3对事件的触发流程为 down,up,click,down,doubleclick. 这带来一个问题:如果我对显示对象同时增加了down,doubleclick事件,如果双击一次,会依次触发down,doubleclick这6个事件。这并不是我期望的结果。(当我
AS3.0 增加了对鼠标事件DOUBLE_CLICK的支持,AS3对事件的触发流程为 down,up,click,down,doubleclick.
这带来一个问题:如果我对显示对象同时增加了down,doubleclick事件,如果双击一次,会依次触发down,doubleclick这6个事件。这并不是我期望的结果。(当我们期望一个显示对象可以有单击,双击,拖拽时就会遇到该问题)

参考网上的一些解决方法,然后优化了一下,做成一个示例如下,备用。基本的解决思路就是不使用原生的click和doubleclick事件,仅仅使用down和up事件,在这两个事件里根据触发事件的时间差值来判断单击,双击和拖拽。


package {
    import com.greensock.TweenLite;
    
    import flash.display.DisplayObjectContainer;
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.utils.getTimer;
    
    public class test extends Sprite {
        private var _rect:Sprite;
        
        public function test() {
            trace("hello world");
            
//            this.stage.addEventListener(MouseEvent.CLICK,__onTraceClick);
            
            drawRect();
            _rect.addEventListener(MouseEvent.ROLL_OVER,__onOver);
            _rect.addEventListener(MouseEvent.ROLL_OUT,__onOut);
            _rect.addEventListener(MouseEvent.MOUSE_DOWN,__onDown);
            
        }
        
        
        private function __onOver(evt:MouseEvent):void {
            //trace("over");
        }
        private function __onOut(evt:MouseEvent):void {
            //trace("out");
        }
        
        private var _preDownTime:int = 0;
        private function __onDown(evt:MouseEvent):void {
            trace("down");
            
            TweenLite.killDelayedCallsTo(doClick);
            
            _rect.addEventListener(MouseEvent.MOUSE_UP,__onUp);
            _rect.startDrag();
            
            _preDownTime = getTimer();
        }
        
        
        private const UP_INTER:int = 300;
        private var _preUpTime:int = 0;
        private function __onUp(evt:MouseEvent):void {
            trace("up");
            _rect.removeEventListener(MouseEvent.MOUSE_UP,__onUp);
            _rect.stopDrag();
            
            var now:int = getTimer();
            if((now - _preUpTime) < UP_INTER) {
                trace("----double click");
            } else if((now - _preDownTime) < UP_INTER) {
                TweenLite.delayedCall(0.2,doClick);
            } else {
                trace("drag");
            }
            _preUpTime = now;
        }
        
        private function doClick():void {
            trace("----click");
        }
        
        private function __onTraceClick(evt:MouseEvent):void {
            var str:String = "";
            trace(printTrace(evt.target as DisplayObjectContainer));
        }
        
        private function printTrace(sp:DisplayObjectContainer):String {
            if(null == sp) {
                return "";
            } else {
                
                return sp.toString() + "/" + printTrace(sp.parent);
            }
        }
        private function drawRect():void {
            var rect:Sprite = new Sprite();
            
            // red rect,starting at point 50,50
            rect.graphics.beginFill(0xFF0000);
            rect.graphics.moveTo(50,50);
            rect.graphics.lineTo(150,150);
            rect.graphics.lineTo(50,150);
            rect.graphics.endFill();
            _rect = rect;
            this.addChild(_rect);
        }
        
        
        
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读