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); } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |