2012-03-12 82 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对象的背面(底部)。


如果指定当前占用的索引位置,则该位置的子对象 以及所有更高位置向上移动在孩子列表中的一个 位置。


我认为,如果你正确地分析所有被添加到舞台上,你自己可能会得到答案。