2013-07-31 141 views
0

我在AS3事件難題中遇到了困難。AS3事件體系結構

我明白目標類從EventDispatch繼承或實現IEventDispatch,並且可以註冊(和其他方法)事件偵聽器。

但是,目標類註冊什麼?如果事件發生,AS3如何知道將事件傳遞給目標類?

Regards, shwell。

回答

0

對於顯示列表中的對象,以下Adobe摘錄就是答案:「當Adobe®Flash®Player分派Event對象時,該Event對象執行從顯示列表根目錄到目標節點的往返旅程,檢查每個節點的註冊監聽者。「。

對於非顯示對象,AS3運行時維護包含綁定變量所有AS3事件的字典。綁定變量是對事件偵聽器的引用。

0

閱讀這篇文章,關於事件階段,它會更有意義:

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

希望這有助於。祝你有美好的一天。

+0

好了,現在我** **不明白一些事情。 Flash播放器如何知道哪個對象應該成爲事件的目標,例如,在鼠標單擊事件上?用什麼確切的方法來確定實際的目標?移動是否一樣,是否檢查某個物體是否被其他物體遮擋,或者不是?它可以通過過濾最上層的IEventDispatcher的'getObjectsUnderPoint()'並將其指定爲目標來完成,但這大多是一種瘋狂的猜測。 – Vesper

+0

Hello Romi,鏈接中的這一行解釋了顯示對象會發生什麼,並且主要回答我的問題。但是非顯示對象呢? - 「當Adobe®Flash®Player調度Event對象時,該Event對象會從顯示列表的根節點到目標節點之間往返,檢查每個節點是否有已註冊的監聽者。」儘管我可以想象對於非顯示對象的類似「往返行程」。 – shwell

0

你可以看一下如何八哥事件工作

starling even dispatcher

當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; 
+0

如果我沒有記錯,Starling爲他們的框架創建了一個完全不同的Event架構/模式,因爲Flash架構無疑是沉重的,特別是當涉及到垃圾收集時。 –

0

在AS3,EventDispatcher是觀察者設計模式的實現。本類實現addEventLister,removeEventListener,dispatchEvent' and hasEventListener`方法。在內部,它還維護一個包含當前正在偵聽的事件的字典或類似數據結構,以及在事件分派時必須調用的方法列表。像這樣的東西 -

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

addEventListener被稱爲對象,它創造了有問題的事件的新重點,並增加了方法參考其關聯的列表。

當在該類上調用dispatchEvent時,它將獲取與該事件關聯的所有方法並調用附加的方法。每個方法都用Event類或其子類的實例調用。

刪除事件偵聽器顯然與添加操作相反。

+0

你好Pranav,如果字典是外部的目標,似乎對目標的引用也必須存儲?這是正確的嗎? – shwell

+0

按目標我假設你指的是派遣事件的類。在這種情況下,不,字典不是外部的。該類繼承自EventDispatcher,所以字典變爲類本身的內部。 –

+0

我想我現在明白了,事件是否傳遞給了所有的EventDispatch類? – shwell

0

我想你錯過了addEventListener()機制。此事件對事件引擎具有全局性副作用,註冊回調函數以及調用者值this以提供觸發事件的正確上下文,通過靜態或動態調用globalToLocal()可能更新event.localXevent.localY屬性,因爲事件冒泡並向下。

如果您和我一樣,對Flash播放器如何確定事件的目標感到困惑 - 有一個內部「焦點」指針,用於確定SWF的哪個組件具有鍵盤焦點,並且該指針用於目標鍵盤事件。對於鼠標事件,最有可能的Flash引擎調用getObjectsUnderPoint()來查詢最頂層IEventDispatcher兼容的對象(不是所有的DisplayObject能處理事件),以及一個被髮送鼠標事件,與以往事件的目標接收說MouseEvent.ROLL_OUTMouseEvent.MOUSE_OUT如果目標已經改變。對於其他事件,很可能整個顯示列表都會反應。