·您当前的位置:首页 > 技术教程 > AS2与AS3技术 >

[AS3]AS3鼠标双击事件的源代码

时间:2015-09-13 21:40酷播
AS3.0 增加了对鼠标事件DOUBLE_CLICK的支持,AS3对事件的触发流程为 down,up,click,down,up,doubleclick.

AS3.0 增加了对鼠标事件DOUBLE_CLICK的支持,AS3对事件的触发流程为 down,up,click,down,up,doubleclick.
这带来一个问题:如果我对显示对象同时增加了down,up,click,doubleclick事件,如果双击一次,会依次触发 down,up,click,down,up,click,doubleclick这6个事件。这并不是我期望的结果。(当我们期望一个显示对象可以有单 击,双击,拖拽时就会遇到该问题)

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

  1. package { 
  2.     import com.greensock.TweenLite; 
  3.      
  4.     import flash.display.DisplayObjectContainer; 
  5.     import flash.display.Sprite; 
  6.     import flash.events.MouseEvent; 
  7.     import flash.utils.getTimer; 
  8.      
  9.     public class test extends Sprite { 
  10.         private var _rect:Sprite; 
  11.          
  12.         public function test() { 
  13.             trace("hello world"); 
  14.              
  15. //            this.stage.addEventListener(MouseEvent.CLICK, __onTraceClick); 
  16.              
  17.             drawRect(); 
  18.             _rect.addEventListener(MouseEvent.ROLL_OVER, __onOver); 
  19.             _rect.addEventListener(MouseEvent.ROLL_OUT, __onOut); 
  20.             _rect.addEventListener(MouseEvent.MOUSE_DOWN, __onDown); 
  21.              
  22.         } 
  23.          
  24.          
  25.         private function __onOver(evt:MouseEvent):void { 
  26.             //trace("over"); 
  27.         } 
  28.         private function __onOut(evt:MouseEvent):void { 
  29.             //trace("out"); 
  30.         } 
  31.          
  32.         private var _preDownTime:int = 0
  33.         private function __onDown(evt:MouseEvent):void { 
  34.             trace("down"); 
  35.              
  36.             TweenLite.killDelayedCallsTo(doClick); 
  37.              
  38.             _rect.addEventListener(MouseEvent.MOUSE_UP, __onUp); 
  39.             _rect.startDrag(); 
  40.              
  41.             _preDownTime = getTimer(); 
  42.         } 
  43.          
  44.          
  45.         private const UP_INTER:int = 300
  46.         private var _preUpTime:int = 0
  47.         private function __onUp(evt:MouseEvent):void { 
  48.             trace("up"); 
  49.             _rect.removeEventListener(MouseEvent.MOUSE_UP, __onUp); 
  50.             _rect.stopDrag(); 
  51.              
  52.             var now:int = getTimer(); 
  53.             if((now - _preUpTime) < UP_INTER) { 
  54.                 trace("- cuplayer.com ---double click"); 
  55.             } else if((now - _preDownTime) < UP_INTER) { 
  56.                 TweenLite.delayedCall(0.2, doClick); 
  57.             } else { 
  58.                 trace("drag"); 
  59.             } 
  60.             _preUpTime = now
  61.         } 
  62.          
  63.         private function doClick():void { 
  64.             trace("----click"); 
  65.         } 
  66.          
  67.         private function __onTraceClick(evt:MouseEvent):void { 
  68.             var str:String = ""
  69.             trace(printTrace(evt.target as DisplayObjectContainer)); 
  70.         } 
  71.          
  72.         private function printTrace(sp:DisplayObjectContainer):String { 
  73.             if(null == sp) { 
  74.                 return ""; 
  75.             } else { 
  76.                  
  77.                 return sp.toString() + "/" + printTrace(sp.parent); 
  78.             } 
  79.         } 
  80.         private function drawRect():void { 
  81.             var rect:Sprite = new Sprite(); 
  82.              
  83.             // CuPlayer.com 提示 red rect, starting at point 50, 50 
  84.             rect.graphics.beginFill(0xFF0000); 
  85.             rect.graphics.moveTo(50, 50); 
  86.             rect.graphics.lineTo(150,50); 
  87.             rect.graphics.lineTo(150,150); 
  88.             rect.graphics.lineTo(50,150); 
  89.             rect.graphics.endFill(); 
  90.             _rect = rect; 
  91.             this.addChild(_rect); 
  92.         } 
  93.     } 

 

热门文章推荐

请稍候...

保利威视云平台-轻松实现点播直播视频应用

酷播云数据统计分析跨平台播放器