2010-02-11 18 views
10

幾年過去了,還有一些關於mouseEnabled的問題我沒有得到。我有一個Sprite(例如這裏的「Sky」,其中包含許多對象,其中一個是Cloud,我不想接收鼠標事件,我把這個Sky覆蓋在其他一些顯示對象上,我希望雲是可見,但不阻止鼠標事件如果你看到透過雲層一棵樹,你應該能夠點擊樹as3 mouseEnabled對我來說仍然是個問題

在天空類:。

mouseEnabled = false; 
cloud.mouseEnabled = false; 
cloud.mouseChildren = false; 

在這種結構中,當雲在樹上我無法點擊樹,因爲雲遮住了它爲什麼?

+3

獎Triynko答案! – 2012-06-08 14:16:45

回答

3

你說那裏有很多對象嗎? lse正在阻止它。我建議增加一個listener到舞臺上,然後就可以看到哪個對象獲得點擊:

import flash.utils.getQualifiedClassName; 
stage.addEventListener(MouseEvent.CLICK, onClick); 
private function onClick(event:MouseEvent):void 
{ 
    trace(event.target.name, getQualifiedClassName(event.target)); 
} 

郵政更多的代碼,我們也許可以幫助更多。

+0

好吧,忘記「多個對象」部分。只有一個我想禁用的對象,另一個我想要啓用。啓用的對象非常小,不會對此產生影響。下面是我使用你發佈的代碼時得到的結果: instance5 flash.display :: Sprite – phil 2010-02-12 00:05:07

+0

ok,所以有一個精靈在那裏沒有一個實例名稱,而是接收點擊而不是雲。你的樹有一個實例名稱?我會給你的剪輯名稱,所以你可以找出哪一個實際上阻止。 – typeoneerror 2010-02-12 00:40:18

26

即使Sky將mouseEnabled/mouseChildren設置爲false ...它仍然是一個對象,它仍佔用空間,因此仍然用作任何沒有設置mouseEnabled/mouseChildren的PARENT容器的命中區域假。

因此,我懷疑你的Sky對象與你的Tree對象不在同一個父容器中。您的Sky對象可能有其自己的父容器對象,這是導致事件截獲的罪魁禍首。要詳細說明:任何包含ANYING的對象都會有一個命中區域,即使它包含的所有單個東西(形狀,子對象等)都可能將mouseEnabled/mouseChildren設置爲false,它將攔截鼠標點擊。

因此,即使您的Sky對象將mouseEnabled設置爲false,您的天空(及其兒童)仍然佔用空間,因此仍然會給Sky的父容器一個命中區域來攔截鼠標事件。

因此,您的解決方案是確保Sky的所有父容器都將其mouseEnabled屬性設置爲false,至少達到(但不包括)Tree和Sky對象的第一個共同祖先容器。

此外,通過設置將mouseEnabled = false,並留下mouseChildren = true時,你可以有一個容器,其中僅將mouseEnabled選擇兒童=​​真收到click事件:)

+0

謝謝,我與textfields有類似的問題,它在一個共享一個共同的祖先到一個按鈕的容器。沒有直接引用容器,我可以調用父容器並將mouseEnabled/Children設置爲false。 – gltovar 2012-10-03 20:39:19

相關問題