我在AS3事件難題中遇到了困難。AS3事件體系結構
我明白目標類從EventDispatch繼承或實現IEventDispatch,並且可以註冊(和其他方法)事件偵聽器。
但是,目標類註冊什麼?如果事件發生,AS3如何知道將事件傳遞給目標類?
Regards, shwell。
我在AS3事件難題中遇到了困難。AS3事件體系結構
我明白目標類從EventDispatch繼承或實現IEventDispatch,並且可以註冊(和其他方法)事件偵聽器。
但是,目標類註冊什麼?如果事件發生,AS3如何知道將事件傳遞給目標類?
Regards, shwell。
對於顯示列表中的對象,以下Adobe摘錄就是答案:「當Adobe®Flash®Player分派Event對象時,該Event對象執行從顯示列表根目錄到目標節點的往返旅程,檢查每個節點的註冊監聽者。「。
對於非顯示對象,AS3運行時維護包含綁定變量所有AS3事件的字典。綁定變量是對事件偵聽器的引用。
閱讀這篇文章,關於事件階段,它會更有意義:
http://livedocs.adobe.com/flex/3/html/help.html?content=events_02.html
希望這有助於。祝你有美好的一天。
你可以看一下如何八哥事件工作
當displayObject的氣泡事件時,它會檢查是否存在DisplayObject的父母和家長是否存在UTIL的祖先加入到bubbleList displayObject爲null。
以下代碼是在此事件八哥
var element:DisplayObject = this as DisplayObject;
var chain:Vector.<EventDispatcher> = new <EventDispatcher>[element];
while ((element = element.parent) != null)
chain[int(length++)] = element;
如果我沒有記錯,Starling爲他們的框架創建了一個完全不同的Event架構/模式,因爲Flash架構無疑是沉重的,特別是當涉及到垃圾收集時。 –
在AS3,EventDispatcher
是觀察者設計模式的實現。本類實現addEventLister
,removeEventListener
,dispatchEvent' and
hasEventListener`方法。在內部,它還維護一個包含當前正在偵聽的事件的字典或類似數據結構,以及在事件分派時必須調用的方法列表。像這樣的東西 -
{"event1": [method7, method5, method3], "event2": [method3, method2], "event3": [method1]};
當addEventListener
被稱爲對象,它創造了有問題的事件的新重點,並增加了方法參考其關聯的列表。
當在該類上調用dispatchEvent
時,它將獲取與該事件關聯的所有方法並調用附加的方法。每個方法都用Event
類或其子類的實例調用。
刪除事件偵聽器顯然與添加操作相反。
我想你錯過了addEventListener()
機制。此事件對事件引擎具有全局性副作用,註冊回調函數以及調用者值this
以提供觸發事件的正確上下文,通過靜態或動態調用globalToLocal()
可能更新event.localX
和event.localY
屬性,因爲事件冒泡並向下。
如果您和我一樣,對Flash播放器如何確定事件的目標感到困惑 - 有一個內部「焦點」指針,用於確定SWF的哪個組件具有鍵盤焦點,並且該指針用於目標鍵盤事件。對於鼠標事件,最有可能的Flash引擎調用getObjectsUnderPoint()
來查詢最頂層IEventDispatcher
兼容的對象(不是所有的DisplayObject能處理事件),以及一個被髮送鼠標事件,與以往事件的目標接收說MouseEvent.ROLL_OUT
或MouseEvent.MOUSE_OUT
如果目標已經改變。對於其他事件,很可能整個顯示列表都會反應。
好了,現在我** **不明白一些事情。 Flash播放器如何知道哪個對象應該成爲事件的目標,例如,在鼠標單擊事件上?用什麼確切的方法來確定實際的目標?移動是否一樣,是否檢查某個物體是否被其他物體遮擋,或者不是?它可以通過過濾最上層的IEventDispatcher的'getObjectsUnderPoint()'並將其指定爲目標來完成,但這大多是一種瘋狂的猜測。 – Vesper
Hello Romi,鏈接中的這一行解釋了顯示對象會發生什麼,並且主要回答我的問題。但是非顯示對象呢? - 「當Adobe®Flash®Player調度Event對象時,該Event對象會從顯示列表的根節點到目標節點之間往返,檢查每個節點是否有已註冊的監聽者。」儘管我可以想象對於非顯示對象的類似「往返行程」。 – shwell