Actionscript 3.0 事件机制剖析(一)
----------------------------Event
大部分人使用的Windows操作系统就是一个典型的基于事件的任务调度系统,时间片的轮转实现多个任务的处理,这是多线程的基础。在Actionscript 3的介绍中,它是基于DOM3事件模型设计的一套事件处理机制,而且在Actionscript中是没有多线程的,所以更凸显了Actionscript中事件的重要性。因此自热而然,事件机制也就成了Actionscript中非常重要的组成部分了。
在Actionscript 3 中要注意区分Event和Event Flow这两个概念。Event在我的理解中是指Actionscript 3的整个事件机制,但是Event Flow是Actionscript 3的一个创新,它只会存在与Actionscript 3的全新的现实模型中,并且只与显示列表有关系(这个刚开始有点不好理解,所以我也分为Event和Event Flow来说明)。学过别的编程语言,如Java、C#,都知道事件,当然也包裹VC中消息机制,消息映射,因为它其实也是事件。
在W3C Document Object Model Level 3 Event Specification中一个完整的事件机制有4个过程
A、注册事件侦听器
也就是设置一事件由那个对象的那个方法来处理。通俗点也就是告诉编译器"假如发生了这个事件,由那个来接手处理这件事情"。比如:我们在一个SimpleButton上点击了鼠标左键,而且这个SimpleButton对象注册了Click事件,哪么当Click事件发生后,SimpleButton注册的时间侦听器就会来处理这个Click事件;再比如这个SimpleButton是在一个MovieClip上,MovieClip对象注册了Click事件,而SimpleButton则没注册,那么当Click事件发生的时候,就会由MovieClip对象注册的事件侦听器来处理这个事件。
B、发送事件
很简单,当我们在一个元件或者舞台上点击了鼠标左键,系统就会发送一个Click事件(至于这个事件是怎么由系统发送给AVM2的可以暂且不了解)。发送的时候,要包括事件的类型,告诉事件侦听器这是一个鼠标左键点击事件,不是右键点击事件。而且只有当这个事件类型与注册的事件侦听器的类型匹配的时候,事件侦听器才会响应你。不然她会说"谁知道你是那个野小子,我是打酱油的"。
C、侦听事件
也就是事件处理函数。发送事件后,匹配的事件侦听器侦听到事件,然后交由这个事件处理函数来处理,这是一个很自然的逻辑。
D、移除侦听器
也就是取消侦听。这个是个重要的步骤,特别是熟悉想C#,Java这些编程语言的人,很容易忽略这个步骤。往往很多时候注册事件后,不用了也不移除。但是这在Actionscript中是很危险,因为这些事件侦听器关系到Actionscript的垃圾回收机制,很容易引起内存泄漏。(弱弱说下,我曾经在这个里面栽了大跟头。)
BTW:给出一个自定义事件的例子,URL:http://blog.csdn.net/li_007/archive/2009/02/23/3926558.aspx