文章分类:JavaEye
最近在写的一个小项目中遇到一个感觉有点不合理的需求,即需要在一个地方同时监听鼠标单击、双击、拖动事件并做出不同的响应,由于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();//调用单击响应函数??
-
????}??
-
}??
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~??
-
????}??
-
}?
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|