0

我正在开发 Flex4 中的自定义上下文菜单。上下文菜单本身工作正常,但我正在寻找一种方法来判断 ContextMenuEvent mouseTarget 是否是图像。就目前而言,mouseTarget 显示它是一个“[object MovieClip]”。这很奇怪,因为我的应用程序中没有影片剪辑,只有图像容器。知道发生了什么吗?

private function openContextMenu(e:ContextMenuEvent):void {
    Alert.show(e.mouseTarget.toString());// shows [object MovieClip] when it should show [Object Image]
}

谢谢

4

3 回答 3

0

因此,经过几个小时的研究,我想出了以下附加到 contextMenu 的项目选择事件侦听器的内容。我确信必须有更好的方法来做到这一点,但在那之前......

for(var i:int = 0; i < getObjectsUnderPoint(new Point(this.mouseX, this.mouseY)).length; i++)
{
    if(getObjectsUnderPoint(new Point(this.mouseX, this.mouseY))[i].parent.parent is Image)
    {
        //do what I need to do
    }
}

感谢 NHubben 的意见。它让我走上了看孩子的正确道路。

于 2012-04-25T21:46:17.723 回答
0

组件名称Image与它的组成无关。flex 继承是:Image -- SWFLoader -- UIComponent -- FlexSprite -- [...](来自mx.controls.Image docs)。

因此,您需要做的是了解将其带入 AS3 环境时实际拥有的内容。似乎它被包裹在一个 MovieClip 中以允许它出现在 Flash 的显示列表中。看起来您还必须通过装载机,但我不确定。

运行一两个测试以找出对象的实际组成:

// not foolproof, and will break on some stuff, 
// so you will have to fix this as needed:
private function loopDisplay(obj:Sprite):void
{
    trace(obj.name + ": " + obj);
    if (obj.numChildren > 0)
    {
        for (var i:int = 0; i < this.numChildren; i++)
        {
            loopDisplay(obj.getChildAt(i));
        }
    }
}

如果你把它放在鼠标按下处理程序中,那么你可以看到实际存在的内容。

但是,event.targetorevent.currentTarget也应该包含菜单项对象,因此您也可以循环进入这些对象并查看其中的内容。

于 2012-04-25T23:49:36.750 回答
0

您需要将 Image 上的 mouseChildren 设置为 false,然后 MouseEvent 将引用 Image:

if (event.target is Image) {
   //do stuff
}
于 2012-04-26T00:31:04.123 回答