AS3事件架构

时间:2013-07-31 08:34:47

标签: actionscript-3

我在AS3赛事的最后一块拼图中遇到了困难。

我理解目标类继承自EventDispatch或实现IEventDispatch,并且可以注册(在其他方法中)事件侦听器。

但是目标类注册了什么?如果事件发生,AS3如何知道将事件传递给目标类?

此致 shwell。

5 个答案:

答案 0 :(得分:0)

阅读这篇关于事件阶段的文章,它会更有意义:

http://livedocs.adobe.com/flex/3/html/help.html?content=events_02.html

希望这会有所帮助。祝你有美好的一天。

答案 1 :(得分:0)

您可以查看八哥活动的工作原理

starling even dispatcher

当displayObject冒泡一个事件时,它将检查displayObject的父元素是否存在,并将该父元素添加到bubbleList,如果存在,则displayObject的祖先为null。

以下代码位于starling eventDispatcher

var element:DisplayObject = this as DisplayObject;
var chain:Vector.<EventDispatcher> = new <EventDispatcher>[element];

while ((element = element.parent) != null)
    chain[int(length++)] = element;

答案 2 :(得分:0)

在AS3中,EventDispatcher是观察者设计模式的实现。此类实现addEventListerremoveEventListenerdispatchEvent' and hasEventListener`方法。在内部,它还维护一个字典或类似的数据结构,其中包含当前正在侦听的事件,以及在调度事件时必须调用的方法列表。像这样的东西 -

{"event1": [method7, method5, method3], "event2": [method3, method2], "event3": [method1]};

在对象上调用addEventListener时,它会为相关事件创建一个新键,并将方法引用添加到其关联的值列表中。

在类上调用dispatchEvent时,它会获取与该事件关联的所有方法,并调用附加的方法。使用Event类或其子类的实例调用每个方法。

删除事件监听器显然与添加操作相反。

答案 3 :(得分:0)

我猜你错过了addEventListener()机制。这件事对事件引擎有全局的副作用,注册回调函数以及调用者this值,以提供已触发事件的正确上下文,可能更新event.localXevent.localY属性随着事件起泡和下降,静态或动态地调用globalToLocal()

如果你像我一样,对Flash播放器如何确定事件的目标感到困惑 - 有一个内部“焦点”指针,用于确定SWF的哪个组件具有键盘焦点,并且该指针用于定位键盘事件。对于鼠标事件,很可能Flash引擎调用getObjectsUnderPoint()来查询最顶层的IEventDispatcher兼容对象(并非所有DisplayObject都可以处理事件),并且会发送一个鼠标事件,其中包含上一个事件的目标如果目标已更改,则收到发言MouseEvent.ROLL_OUTMouseEvent.MOUSE_OUT。对于其他事件,很可能整个显示列表都可以做出反应。

答案 4 :(得分:0)

对于显示列表中的对象,Adobe的以下摘录是答案“当Adobe®Flash®Player调度Event对象时,该Event对象从显示列表的根目录到目标节点进行往返旅程,检查注册听众的每个节点。“。

对于非显示对象,AS3运行时维护包含绑定变量的所有AS3事件的字典。绑定变量是对事件侦听器的引用。