29
2016
07

as3自己实现双击

as3中有双击事件。自己用单击事件实现了一个双击,来满足一些特殊的需求。

直接上demo:双击

获得 Adobe Flash Player

主要代码:

HDoubleClick.as

package com.hanyeah.events
{
	import flash.display.Stage;
	import flash.events.EventDispatcher;
	import flash.events.MouseEvent;
	import flash.utils.setTimeout;
	import flash.utils.clearTimeout;
	import flash.utils.clearTimeout;
	import com.hanyeah.events.HEvent;
	
	public class HDoubleClick extends EventDispatcher
	{
		
		private var stage:Stage;
		private var delay:Number = 300;
		private var lastE:MouseEvent;
		private var interval:uint;
		
		public function HDoubleClick(stage:Stage)
		{
			this.stage = stage;
			stage.addEventListener(MouseEvent.CLICK, clickHandler);
		}
		
		private function clickHandler(e:MouseEvent):void
		{
			if (lastE)
			{
				//
				if (interval)
				{
					clearTimeout(interval);
					interval = 0;
				}
				//
				if (lastE.stageX == e.stageX && lastE.stageY == e.stageY)
				{ //虽然stageX、stageY是Number类型,但是都是整数,所以这么判断没问题
					//两次点击是在同一个位置,认为是双击(不考虑点击的目标是否相同)
					var me:HEvent = new HEvent(HEvent.DOUBLE_CLICK, [lastE, e], false, false);
					dispatchEvent(me);
					lastE = null;
				}
				else
				{
					//两次点击不是在同一个位置
					lastE = e;
					interval = setTimeout(clearE, delay);
				}
			}
			else
			{
				lastE = e;
				interval = setTimeout(clearE, delay);
			}
		}
		
		/**
		 * 超时清空存储的MouseEvent
		 */
		private function clearE():void
		{
			interval = 0;
			lastE = null;
		}
		
		public function destroy():void
		{
			stage.removeEventListener(MouseEvent.CLICK, clickHandler);
			stage = null;
			if (interval)
			{
				clearTimeout(interval);
				interval = 0;
			}
		}
	}
}

Main.as

package  {
	
	import com.hanyeah.events.HDoubleClick;
	import com.hanyeah.events.HEvent;
	import fl.controls.TextArea;
	import flash.display.MovieClip;
	import flash.events.MouseEvent;
	import flash.text.TextField;
	
	
	public class Main extends MovieClip {
		
		public var tf:TextArea;
		public function Main() {
			// constructor code
			//stage.addEventListener(MouseEvent.CLICK, clickHandler);
			var doubleClick:HDoubleClick = new HDoubleClick(stage);
			doubleClick.addEventListener(HEvent.DOUBLE_CLICK, doubleClickHandler);
			
		}
		
		private function doubleClickHandler(e:HEvent):void 
		{
			var arr:Array = e.data as Array;
			showMsg("============================");
			showMsg(arr[0])
			showMsg(arr[1])
		}
		private function showMsg(msg:String):void {
			trace(msg);
			tf.appendText(msg + "\n");
		}
		
		private function clickHandler(e:MouseEvent):void 
		{
			trace(e.stageX, e.stageY);
		}
	}
	
}

实例化HDoubleClick时传入stage对象,然后用HDoubleClick对象侦听HEvent.DOUBLE_CLICK事件,当舞台上发生双击事件时,会触发事件。HEvent对象的data属性是一个数组,包含两次点击的MouseEvent对象,如果想要判断双击是否发生在一个目标对象上,可以对比两个MouseEvent对象的target。


源码打包下载

« 上一篇下一篇 »

相关文章:

闪电效果  (2017-11-28 15:4:19)

线段与椭圆的交点  (2017-1-6 14:43:41)

as3录制swf并保存flv视频  (2016-12-28 8:43:41)

解九连环  (2016-12-1 20:58:11)

as3实现setTimeout和trace  (2016-11-10 16:47:37)

registerCursor注册系统光标  (2016-9-14 9:49:40)

鼠标光标管理  (2016-9-13 17:44:3)

变形框(transform)实现  (2016-9-13 16:56:6)

flash文本消除锯齿不显示  (2016-8-25 11:43:31)

greenSock的easing曲线  (2016-8-24 18:30:11)

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。