最近在写的一个小项目中遇到一个感觉有点不合理的需求,即需要在一个地方同时监听鼠标单击、双击、拖动事件并做出不同的响应,由于AS3事件机制的问题,处理这个需求有点小麻烦,下面分析一下
- 单击 :MouseEvent.CLICK事件,就单击事件,没啥好说的
- 双击 :MouseEvent.DOUBLE_CLICK事件,据师兄春哥说AS2里面是没有这个事件的,他都 是自己写双击事件;现在AS3是提供了这样的事件,我只要doubleClickEnabled=true就可以用了,但问题是默认 doubleClick会先监听到一次Click事件,去调用Click的监听函数,这样子就麻烦了
- 拖动 :拖动其实就三个过程,MOUSE_DOWN,MOUSE_MOVE,MOUSE_UP,但问题是MOUSE_DOWN,MOUSE_UP完了以后Flash又认为这是一次Click事件,就又会去调Click的监听函数,纠结。
解决思路:
- 区分单击、双击:不直接在单击双击事件里面写相应,而是先就这两个事件分别修改一个布尔值,然后Timer判断,再根据此布尔值判断是调双击的方法还是单击的方法,废话不多说上代码:
var mySprite:Sprite = new Sprite(); var isDoubleClick:Boolean = false;//判断是否是双击的标志 mySprite.addEventListener(MouseEvent.CLICK, onClick); mySprite.addEventListener(MouseEvent.DOUBLE_CLICK, onDoubleClick); private function onDoubleClick(event:MouseEvent):void { isDoubleClick = true; } private function onClick(event:MouseEvent):void { isDoubleClick = false; var timer:Timer = new Timer(260, 1); timer.start();//也就是说两次单击间隔在260毫秒之内的就被认为是双击 timer.addEventListener(TimerEvent.TIMER, clickOrDouble);//这边的clickOrDouble也可以写成匿名函数,把mouseEvent传进去 } private function clickOrDouble():void { if(isDoubleClick){ doubleClickFunc();//调用双击响应函数 }else{ clickFunc();//调用单击响应函数 } }
- 区分单击、移动:MOUSE_DOWN和MOUSE_MOVE的时候分别修改一个布尔值,CLICK里面就根据这个布尔值来判断是不是拖动中,思路其实差不多,代码:
private var isDragging:Boolean;//判断是否在拖动中的标志 mySprite.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); mySprite.addEventListener(MouseEvent.CLICK, onClick); private function onMouseDown(event:MouseEvent):void{ isDragging = false; //bla bla bla~~ mySprite.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove); mySprite.addEventListener(MouseEvent.MOUSE_UP, onMouseUp); } private function onMouseMove(event:MouseEvent):void { isDragging = true; //bla bla bla~~ } private function onClick(event:MouseEvent):void { if (isDragging == false) { //bla bla bla~ } }