flex 事件机制-基于Actionscript 3.0

Flex 事件机制—基于Actionscript3.0

1 、视图组件的事件响应过程

事件流

显示列表以一种可以描述为树的层次结构形式进行组织。位于显示列表层次结构顶部的是舞台,是一种特殊的显示对象容器,用作显示列表的根。舞台由 flash.display.Stage类表示,且只能通过显示对象访问。每个显示对象都有一个名为 stage的属性,该属性表示应用程序的舞台。

Flash Player 调度事件对象时,该事件对象进行一次从舞台Stage到“目标节点”target的往返行程,这个过程就是事件流。事件流分为三个阶段:

捕获阶段

       该阶段包括从舞台到目标节点的父节点范围内的所有节点.

目标阶段

       该阶段仅包括目标节点.

冒泡阶段

       目标节点的父节点返回到舞台的行程中遇到的节点.

2、事件派发

mx.core.UIComponent.dispatchEvent(event:Event):Boolean

将事件分派到事件流中。事件目标是对其调用 dispatchEvent() 方法的 EventDispatcher 对象。

参数:

event 分派到事件流中的 Event 对象。如果正在重新分派事件,则会自动创建此事件的一个克隆。 在分派了事件后,其 target 属性将无法更改,因此您必须创建此事件的一个新副本以能够重新分派。

返回:

如果成功分派了事件,则值为 true。值 false 表示失败或对事件调用了 preventDefault() 方法。

3、事件侦听

flash.events.EventDispatcher.addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false):void

使用 EventDispatcher 对象注册事件侦听器对象,以使侦听器能够接收事件通知。可以为特定类型的事件、阶段和优先级在显示列表中的所有节点上注册事件侦听器。

成功注册一个事件侦听器后,无法通过额外调用 addEventListener() 来更改其优先级。要更改侦听器的优先级,必须首先调用 removeListener()。然后,可以使用新的优先级再次注册该侦听器。

注册该侦听器后,如果继续调用具有不同 type 或 useCapture 值的addEventListener(),则会创建单独的侦听器注册。例如,如果首先注册 useCapture 设置为 true 的侦听器,则该侦听器只在捕获阶段进行侦听。如果使用同一个侦听器对象再次调用 addEventListener(),并将 useCapture 设置为 false,那么便会拥有两个单独的侦听器:一个在捕获阶段进行侦听,另一个在目标和冒泡阶段进行侦听。

不能只为目标阶段或冒泡阶段注册事件侦听器。这些阶段在注册期间是成对出现的,因为冒泡阶段只适用于目标节点的始祖。

如果不再需要某个事件侦听器,可调用 removeEventListener() 删除它,否则会产生内存问题。事件侦听器不会自动从内存中删除,因为只要调度对象存在,垃圾回收器就不会删除侦听器(除非 useWeakReference 参数设置为 true)。

参数:

type 事件的类型。

listener 处理事件的侦听器函数。此函数必须接受 Event 对象作为其唯一的参数,并且不能返回任何结果,如下面的示例所示: 。 function(evt:Event):void

函数可以有任何名称。

useCapture 此参数适用于 SWF 内容所使用的 ActionScript 3.0 显示列表体系结构中的显示对象。确定侦听器是运行于捕获阶段还是目标阶段和冒泡阶段。如果将 useCapture 设置为 true,则侦听器只在捕获阶段处理事件,而不在目标或冒泡阶段处理事件。如果 useCapture 为 false,则侦听器只在目标或冒泡阶段处理事件。要在所有三个阶段都侦听事件,请调用 addEventListener 两次:一次将 useCapture 设置为 true,一次将 useCapture 设置为 false。

priority 事件侦听器的优先级。优先级由一个带符号的 32 位整数指定。数字越大,优先级越高。优先级为n 的所有侦听器会在优先级为n -1 的侦听器之前得到处理。如果两个或更多个侦听器共享相同的优先级,则按照它们的添加顺序进行处理。默认优先级为 0。

useWeakReference 确定对侦听器的引用是强引用,还是弱引用。强引用(默认值)可防止您的侦听器被当作垃圾回收。弱引用则没有此作用。

类级别成员函数不属于垃圾回收的对象,因此可以对类级别成员函数将 useWeakReference 设置为 true 而不会使它们受垃圾回收的影响。如果对作为嵌套内部函数的侦听器将 useWeakReference 设置为 true,则该函数将作为垃圾回收并且不再是永久函数。如果创建对该内部函数的引用(将该函数保存到另一个变量中),则该函数将不作为垃圾回收并仍将保持永久。

4 、停止事件流

可以调用 Event.stopPropogation() 方法或 Event.stopImmediatePropogation()方法来阻止在事件流中继续执行事件对象。这两种方法几乎相同,只有在是否允许执行当前节点的其它事件侦听器方面不同:

Event.stopPropogation() 方法可阻止事件对象移动到下一个节点,但只有在允许执行当前节点上的任何其它事件侦听器之后才起作用。

Event.stopImmediatePropogation() 方法也阻止事件对象移动到下一个节点,但不允许执行当前节点上的任何其它事件侦听器。调用其中任何一个方法对是否发生与事件关联的默认行为没有影响。使用 Event类的默认行为方法可以阻止默认行为。

5、自定义事件

       继承flash.events.Event及其子类

重写clone()方法(必须重写),toString()方法(非必须)

添加type,

添加属性

添加构造器

6、DynamicEvent

       参见 DynamicEvent源代码,学习自定义事件的方法.

       分析Dynamic  class的利弊

示例代码见:

http://download.csdn.net/detail/feiyingwang/4744450

上一篇:having在Oracle和mysql小点不同


下一篇:javascript-大多数Flash游戏在浏览器窗口中无法正确调整大小.我如何轻松地使我的游戏做到这一点?