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

[AS3]as3中的单击双击事件源代码

时间:2015-11-24 21:57酷播
[AS3]as3中的单击双击事件源代码

有一天,策划提了个这样的需求,在游戏背包中,如果仓库界面打开的情况下,单击物品则弹出操作菜单,如果是双击的话直接存储到仓库中。

单击弹出操作菜单

我想,这还不简单嘛,物品监听鼠标的MouseEvent.CLICK和MouseEvent.DOUBLE_CLICK两个事件不就行了嘛,然后分别处理对应的事件,我就开始敲代码了。

  1. package { 
  2. import flash.display.Sprite; 
  3. import flash.events.Event; 
  4. import flash.events.MouseEvent; 
  5.  
  6. public class Main extends Sprite { 
  7.     public function Main() { 
  8.         if (stage)onInit(); 
  9.         else stage.addEventListener(Event.ADDED_TO_STAGE, onInit); 
  10.     } 
  11.  
  12.     private function onInit(event:Event = null):void { 
  13.         stage.removeEventListener(Event.ADDED_TO_STAGE, onInit); 
  14.         stage.addEventListener(MouseEvent.CLICK, onClickHandler); 
  15.         stage.doubleClickEnabled=true
  16.         stage.addEventListener(MouseEvent.DOUBLE_CLICK, onDoubleClickHandler); 
  17.     } 
  18.  
  19.     private function onDoubleClickHandler(event:MouseEvent):void { 
  20.         trace("酷播cuplayer.com双击放入仓库"); 
  21.     } 
  22.  
  23.     private function onClickHandler(event:MouseEvent):void { 
  24.         trace("酷播cuplayer.com单击弹出操作菜单"); 
  25.     } 

运行完后发现有问题,当我单击时,可以正确响应单击事件,但是当我双击时,不仅会响应双击事件,而且还会响应单击事件。就是原本我想双击放入仓库的,确实 有放入仓库,但是又弹出了操作菜单。原来是触发MouseEvent.DOUBLE_CLICK事件前会触发MouseEvent.CLICK事件,那有 没有办法不让双击时触发单击事件呢,查询了资料后发现没有办法改变flash本身的这个机制,那只能另辟蹊径了。下面是我的方法,原理很简单,就是判断在 很短的时间内,是单击了一下呢还是单击了两次。代码如下。

  1. package { 
  2. import flash.display.Sprite; 
  3. import flash.events.Event; 
  4. import flash.events.MouseEvent; 
  5. import flash.utils.clearTimeout; 
  6. import flash.utils.setTimeout; 
  7.  
  8. public class DoubleClick extends Sprite { 
  9.     private static const DOUBLE_CLICK_SPEED = 300
  10.     //双击事件的处理时间 
  11.  
  12.     public function DoubleClick() { 
  13.         if (stage)onInit(); 
  14.         else stage.addEventListener(Event.ADDED_TO_STAGE, onInit); 
  15.     } 
  16.  
  17.     private var click_once:Boolean; 
  18.     private var time_id:uint; 
  19.  
  20.     private function onInit(event:Event = null):void { 
  21.         stage.removeEventListener(Event.ADDED_TO_STAGE, onInit); 
  22.         stage.addEventListener(MouseEvent.CLICK, onMouseHandler); 
  23.         stage.doubleClickEnabled = true
  24.         stage.addEventListener(MouseEvent.DOUBLE_CLICK, onMouseHandler); 
  25.     } 
  26.  
  27.     private function onMouseHandler(event:MouseEvent):void { 
  28.         if (time_id) { 
  29.             //如果time_id为true的话说明在300毫秒已经单击过了一次 
  30.             clearTimeout(time_id); 
  31.             onDoubleClickHandler(); 
  32.         } else { 
  33.             //如果300毫秒后没有再次单击的话则调用单击事件 
  34.             time_id = setTimeout(onClickHandler, DOUBLE_CLICK_SPEED); 
  35.         } 
  36.     } 
  37.  
  38.     private function onClickHandler():void { 
  39.         trace("单击弹出操作菜单"); 
  40.         //单击完成后要初始化为0 
  41.         time_id=0
  42.     } 
  43.  
  44.     private function onDoubleClickHandler():void { 
  45.         trace("双击放入仓库"); 
  46.     } 

现在可以正确响应单双击事件了,美中不足的一个是如果是单击的话,会有一点延迟的感觉,没有直接响应MouseEvent.CLICK事件来的灵敏,不过人无完人,这么点延迟还是可以接受的吧。

本文出自 unityas,转载时请注明出处及相应链接。

热门文章推荐

请稍候...

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

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