datagrid tree 区分 itemclick 和itemdoubleclick事件

最近在写的一个小项目中遇到一个感觉有点不合理的需求,即需要在一个地方同时监听鼠标单击、双击、拖动事件并做出不同的响应,由于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~
		}
	}


 

你可能感兴趣的:(Flash,UP)