我在AS3赛事的最后一块拼图中遇到了困难。
我理解目标类继承自EventDispatch或实现IEventDispatch,并且可以注册(在其他方法中)事件侦听器。
但是目标类注册了什么?如果事件发生,AS3如何知道将事件传递给目标类?
此致 shwell。
答案 0 :(得分:0)
阅读这篇关于事件阶段的文章,它会更有意义:
http://livedocs.adobe.com/flex/3/html/help.html?content=events_02.html
希望这会有所帮助。祝你有美好的一天。
答案 1 :(得分:0)
您可以查看八哥活动的工作原理
当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
是观察者设计模式的实现。此类实现addEventLister
,removeEventListener
,dispatchEvent' and
hasEventListener`方法。在内部,它还维护一个字典或类似的数据结构,其中包含当前正在侦听的事件,以及在调度事件时必须调用的方法列表。像这样的东西 -
{"event1": [method7, method5, method3], "event2": [method3, method2], "event3": [method1]};
在对象上调用addEventListener
时,它会为相关事件创建一个新键,并将方法引用添加到其关联的值列表中。
在类上调用dispatchEvent
时,它会获取与该事件关联的所有方法,并调用附加的方法。使用Event
类或其子类的实例调用每个方法。
删除事件监听器显然与添加操作相反。
答案 3 :(得分:0)
我猜你错过了addEventListener()
机制。这件事对事件引擎有全局的副作用,注册回调函数以及调用者this
值,以提供已触发事件的正确上下文,可能更新event.localX
和event.localY
属性随着事件起泡和下降,静态或动态地调用globalToLocal()
。
如果你像我一样,对Flash播放器如何确定事件的目标感到困惑 - 有一个内部“焦点”指针,用于确定SWF的哪个组件具有键盘焦点,并且该指针用于定位键盘事件。对于鼠标事件,很可能Flash引擎调用getObjectsUnderPoint()
来查询最顶层的IEventDispatcher
兼容对象(并非所有DisplayObject都可以处理事件),并且会发送一个鼠标事件,其中包含上一个事件的目标如果目标已更改,则收到发言MouseEvent.ROLL_OUT
或MouseEvent.MOUSE_OUT
。对于其他事件,很可能整个显示列表都可以做出反应。
答案 4 :(得分:0)
对于显示列表中的对象,Adobe的以下摘录是答案“当Adobe®Flash®Player调度Event对象时,该Event对象从显示列表的根目录到目标节点进行往返旅程,检查注册听众的每个节点。“。
对于非显示对象,AS3运行时维护包含绑定变量的所有AS3事件的字典。绑定变量是对事件侦听器的引用。