2012-03-12 81 views
0

我已經使用AS3創建了自定義contextMenu,並且可以將其應用於舞臺。我放置在舞臺上的任何影片剪輯不會從舞臺繼承contextMenu,即它們顯示默認的contextMenu。AS3爲兒童定製contextMenu

如何將我的自定義contextMenu應用於我的應用程序中的每個孩子?

[編輯]

這是我在我的main.as文件的簡化版本:

var my_menu:ContextMenu = new ContextMenu(); 
my_menu.hideBuiltInItems(); 

var my_copyright = new ContextMenuItem("Copyright - 2012"); 
my_copyright.enabled = false; 
my_copyright.separatorBefore = true; 

my_menu.customItems.push(my_copyright); 

stage.contextMenu = my_menu; 

如果我在舞臺上單擊鼠標右鍵,然後我得到的版權。如果我添加一個movieclip(或其他任何東西)到舞臺上,然後右鍵單擊它,然後我得到默認的上下文菜單。

我發現了問題,並修復了它。我正在使用stage.addChildAt(mc,0);添加背景圖像。出於某種原因,這會刪除上下文菜單。將孩子置於1可修復此問題,並允許所有內容都繼承contextMenu。

前:http://richard.parnaby-king.co.uk/examples/stackoverflow/stackoverflow.swf

後:http://richard.parnaby-king.co.uk/examples/stackoverflow/stackoverflow-after.swf

,我改變了獎金的目的 - 有人可以解釋爲什麼會這樣!?

+0

你能分享你的上下文菜單代碼嗎? – 2012-03-12 20:58:19

+0

@theButler我已添加示例代碼。 – 2012-03-13 10:05:32

+0

你如何在場景中加入contextMenu?我收到「錯誤#2071:舞臺類沒有實現此屬性或方法。」當試圖。另外,main.as是你的文檔類嗎? – 2012-03-19 17:48:13

回答

1

好吧,所以經過一些測試,這是我的。我不能說這是明確的,因爲閃光燈不會給事件做右鍵點擊,所以這只是一個猜測,但它似乎撐不住。

在一個側面說明,你不能添加上下文菜單的舞臺,也不會允許的話,那麼最低的項目,你可以將它添加到的文檔類

當你的權利點擊一個DisplayObject,它會在該對象上尋找一個ContextMenu。它找不到一個,它會繼續在該對象的層次結構中尋找一個,當它找到一個時停止。事情是這樣的:

stage 
    - document (has context menu1) 
     - parent (has context menu2) 
      - child 
     - parent2 

在這個例子中,如果你右擊child,有沒有菜單,所以它看起來parent。在這裏它發現context menu2所以它表明。但是,如果您右鍵單擊parent2,則沒有菜單,因此它看起來爲document,在這裏它找到context menu1

雖然當你右鍵單擊舞臺上的其他地方(即沒有圖形的地方),似乎有點破解。在這種情況下,由於舞臺不能有ContextMenu(或者至少你不能設置一個),它似乎決定使用深度爲0的孩子的上下文菜單(通常是文檔類)。

當你在深度0添加背景圖片,你在你的文檔類碰撞高達深度1.您的層次結構,現在看起來是這樣的:

stage 
    - bg 
    - document (has context menu1) 
     - parent (has context menu2) 
      - child 
     - parent2 

我假設你要添加您的上下文菜單添加到文檔類(在此示例中爲context menu1),因此除非您的文檔類中包含一些圖形,否則您的事件將搜索到舞臺,找不到任何上下文菜單,然後嘗試查找子0的上下文菜單 - 這種情況下bg哪一個沒有。

您可以通過在文檔類的graphics對象中繪製某些內容(或單擊其中一個嵌套元素)來測試此內容。如果右鍵單擊圖形,即使bg處於深度0,您仍會看到自定義菜單。或者,您可以將另一個菜單添加到bg以查看我的意思。

0

嘗試改變stage.contextMenu = my_menu;只是contextMenu = my_menu;

+0

謝謝你的建議,但是這是行不通的。 – 2012-03-19 16:52:51

+0

我應該指定,我這樣做的方式是將我的上下文菜單代碼放入我的文檔類中的公共函數中,然後在時間軸上的第一幀中調用該函數。我不知道這是否重要,但我總是將時間線代碼放在單獨的圖層上,並將其作爲最頂層。這聽起來和你嘗試的沒有什麼不同,但有時候Flash可能會變得很奇怪。 – 2012-03-19 20:36:41

1

回答你的真正原因是主觀的給你添加到舞臺&他們爲了什麼。

我可以從關於其的adobe live docs引述2點:


索引0表示顯示列表的用於 該DisplayObjectContainer對象的背面(底部)。


如果指定當前佔用的索引位置,則該位置的子對象 以及所有更高位置向上移動在孩子列表中的一個 位置。


我認爲,如果你正確地分析所有被添加到舞臺上,你自己可能會得到答案。