Event事件处理机制和原理

来源:互联网 发布:c语言初学者用什么编程软件 编辑:程序博客网 时间:2024/06/05 00:11

一)事件处理机制的原理

        事件模型定义了一套标准的生成和处理事件消息的方法,使程序中的对象可以相互交互、通信、保持自身状态和相应变化。简单的说,数据的提供者只管发出数据对象,只要确保数据对象是 Event类或者子类的实例即可。

        这种数据对象,称为事件(Event。数据对象的发出者,称之为事件发送者(Event dispatcher。同时,接受事件的对象,称为 事件侦听者(Event listener)

我们来看一个简单的例子。

 

         当我们想要和男(女)朋友约会的时候,我们通常都会有一个约会的发起者,同时还有个一个约会对象。那么在这个邀请过程中,就是一个很好的事件过程。

这个过程请见下图:


           男朋友是事件发送者,邀请约会就是男朋友发送的事件。而女朋友就是事件侦听器

           这个事件,包含三条主要内容:事件的类型,事件的目标,事件的相关数据。事件的类型就是邀请约会,女朋友会根据事件的不同,来执行不同的任务。比如,事件是邀请约会,那么女朋友可能会执行,梳妆打扮,然后赴约。如果事件肚子饿了,那么女朋友会执行买菜做饭。

          事件的目标,就是事件的发送者。如果没有这个信息,那么女朋友接到事件后,就无法知道是谁要约她,或者是谁饿了。

          事件的数据,就是事件所要包含的信息。上面的约会事件中,事件的信息可以包括事件,地点,干什么。同理,肚子饿了这个事件,要包含的信息是想吃些什么,在家里吃还是去外面吃等等。当然,也有一些事件是不包含信息的,例如捶背,事件接受者只要收到这个事件,直接执行就可以了。

 

二) 事件执行流程

  事件机制包含4个步骤:注册侦听器,发送事件,侦听事件,移除侦听器。这四个步骤是按照顺序来执行的。

注册侦听器,即指定事件由哪个对象的哪个方法来接受。在上一节约会的例子中,我们指定由男朋友来发送事件,由女朋友来接受事件。

           只有在注册侦听器后,发送的事件才能被侦听。而且发送的事件必须和侦听器事件的类型匹配。在发送事件后,侦听器才能侦听到事件。

 

三)Event类

           Event类是所有事件类的基类。当你你要创建一个自定义事件的时候,事件应该继承自Event类。同时Event类也包含一些事件。这些事件通常与显示列表,显示对象的状态有关。

          在使用Event类时,有几个属性与方法需要我们注意。

          首先是构造函数中的三个参数:typebubblescancelable

1type指定我们事件的类型,在约会的例子中,我们的type事件类型为“DATE”。我们经常使用的事件类型有“ADDED”“COMPLETE”等。

2bubbles是指定事件是否参与事件流的冒泡阶段,关于事件流,会在后面的小节中介绍。

3cancelable表示是否要取消Event对象。

另外还需要关注的属性就是target,这个属性表示事件的目标,也就是事件的发送者。其他的一些方法都与事件流有关,后面的内容会进行详细介绍。


四)事件侦听器

          事件侦听器也就是事件的处理者,负责接收事件携带的信息,并在接收到该事件后执行特定的代码。

          常见Event事件的侦听器必须是一个函数。事件的发送者必须是 EventDispather类或者子类的实例。只有事件发送者才能侦听事件,并且可以注册侦听器。

          侦听事件分为两个部分,第一是建立侦听器,侦听器可以是独立的函数,也可以是某一个对象的方法。第二步是注册侦听器,使用事件发送者的 addEventDispather将相应的事件分配给侦听器。

          对于注册侦听函数的定义。我们常用的只有三个参数:

1)第一个参数type表示事件类型。

2listener就是用来处理事件的侦听器。

3thisObject比较特殊,一般我们填写this


五)创建侦听器

            一个侦听器必须是函数,它可以是一个独立函数,也可以是一个实例的方法。侦听器必须有一个参数,并且这个参数必须是 Event类实例或其子类的实例,同时,侦听器的返回值必须为空(void)。范例代码如下:

listenerName(evt:Event):void{...}


六)注册侦听器与移除侦听器

            只有事件的发送者才可以注册侦听器,事件的发送者必须是 EventDispatcher类或其子类的实例。移除侦听器也同理,通常情况下,注册侦听器与移除侦听器都是成对出现。

注册侦听器

事件发送者.addEventListener(事件类型,侦听器, this);

移除侦听器

事件发送者.removeEventListener(事件类型,侦听器, this);


)检测侦听器

          如果你需要在逻辑中检测某一个事件发送者是否注册了侦听器,那么你有两个方法可以使用。一个是 hasEventListener ,另外一个是willTrigger 。两个方法执行效果相同,都是判断一个事件发送者是否注册了某一个类型的事件。

          如果该事件类型已经被注册过,返回 true,如果没有被注册过,返回 false

事件发送者.hasEventListener(事件类型);


八)TouchEvent的启动开关

           TouchEvent的启动开关 touchEnabled 指定此对象是否接收触摸或其他用户输入。默认值为 true,这表示默认情况下,显示列表上的任何 DisplayObject实例都会接收触摸事件或其他用户输入事件。如果将 touchEnabled设置为false,则实例将不接收任何触摸事件(或其他用户输入事件)。显示列表上的该实例的任何子级都不会受到影响。要更改显示列表上对象的所有子级的 touchEnabled行为,请使用 DisplayObjectContainer.touchChildren

实际使用过程,如果某些显示对象不再需要侦听TouchEvent,那就及时关闭吧:

显示对象实例.touchEnabled = false;


九)事件的优先级

           事件是可以设置优先级的,这是一个非常方便而且灵活的功能。我们可以通过制定事件的优先级来确保那个事件侦听器会得到提前处理。

你可以在注册侦听器的时候制定事件的优先级。

publicaddEventListener(type:string, listener:Function, thisObject:any,useCapture:boolean = false, priority:number = 0)

         制定优先级需要设置 priority属性。该属性为一个number类型,当数字越大,则优先级越大。在触发事件的时候优先级越高。





简单实例应用链接:http://blog.csdn.net/xiu2016/article/details/76576871