Flex中区分单击和双击的方法

文章分类: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判断,再根据此布尔值判断是调双击的方法还是单击的方法,废话不多说上代码:

 

Xml代码  

收藏代码

  1. var  mySprite:Sprite  =  new  Sprite();  
  2. var isDoubleClick:Boolean  =  false ;//判断是否是双击的标志  
  3. mySprite.addEventListener(MouseEvent.CLICK, onClick);  
  4. mySprite.addEventListener(MouseEvent.DOUBLE_CLICK, onDoubleClick);  
  5. private function onDoubleClick(event:MouseEvent):void {  
  6.     isDoubleClick  =  true ;  
  7. }  
  8. private function onClick(event:MouseEvent):void {  
  9.     isDoubleClick  =  false ;  
  10.     var timer:Timer  =  new  Timer(260, 1);  
  11.     timer.start();//也就是说两次单击间隔在260毫秒之内的就被认为是双击  
  12.     timer.addEventListener(TimerEvent.TIMER, clickOrDouble);//这边的clickOrDouble也可以写成匿名函数,把mouseEvent传进去  
  13. }  
  14. private function clickOrDouble():void {  
  15.     if(isDoubleClick){  
  16.         doubleClickFunc();//调用双击响应函数  
  17.     }else{  
  18.         clickFunc();//调用单击响应函数  
  19.     }  
  20. }  
 
  • 区分单击、移动:MOUSE_DOWN和MOUSE_MOVE的时候分别修改一个布尔值,CLICK里面就根据这个布尔值来判断是不是拖动中,思路其实差不多,代码:

 

Xml代码  

收藏代码

  1. private var isDragging:Boolean;//判断是否在拖动中的标志  
  2. mySprite.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);  
  3. mySprite.addEventListener(MouseEvent.CLICK, onClick);  
  4. private function onMouseDown(event:MouseEvent):void{  
  5.     isDragging  =  false ;  
  6.     //bla bla bla~~  
  7.     mySprite.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);  
  8.     mySprite.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);  
  9. }  
  10. private function onMouseMove(event:MouseEvent):void {  
  11.     isDragging  =  true ;  
  12.     //bla bla bla~~  
  13. }  
  14. private function onClick(event:MouseEvent):void {  
  15.     if (isDragging  == false) {  
  16.         //bla bla bla~  
  17.     }  

相关文章

一:display:flex布局display:flex是一种布局方式。它即可以...
1. flex设置元素垂直居中对齐在之前的一篇文章中记载过如何...
移动端开发知识点pc端软件和移动端apppc端软件是什么,有哪些...
最近挺忙的,准备考试,还有其他的事,没时间研究东西,快周...
display:flex;把容器设置为弹性盒模型(设置为弹性盒模型之后...
我在网页上运行了一个Flex应用程序,我想使用Command←组合键...