文章分类: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();//调用单击响应函数
- }
- }
- 区分单击、移动: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~
- }
- }