2012-04-25 83 views
0

长时间阅读器,第一次张贴海报:)。Flex 4图像对象作为MovieClip对象返回

我正在处理Flex4中的自定义上下文菜单。上下文菜单本身工作正常,但我正在寻找一种方法来判断ContextMenuEvent mouseTarget是否为图像。就目前而言,mouseTarget显示它是一个“[对象MovieClip]”。这很奇怪,因为我的应用程序中没有影片剪辑,只有图像容器。任何想法是怎么回事?

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

感谢

+0

是你的图像容器影片剪辑或者是他们的Loader对象? – Corey 2012-04-25 14:55:07

+0

图像容器是项目。我后来添加“source”属性以基于从fileRef的.load操作加载的数据。 – Dom 2012-04-25 15:07:56

+0

您可能需要深入研究MovieClip以查看它是否为图像等。Image类扩展了许多对象,最重要的可能是所示的位图。您可能想要探索Flex中的BitmapImage类,可以提供更直接的路线以获得所需的内容。 – NHubben 2012-04-25 15:53:41

回答

0

您需要设置mouseChildren上的图像假的,那么的MouseEvent将参照图片:

if (event.target is Image) { 
    //do stuff 
} 
+0

这很完美。误解我在文档中快速阅读的mouseChildren,我试过了,当它不起作用时就放弃了。因此,图像标签上的mouseChildren = false是解决方案。大概是从我的解决方案中保存了毫秒,还有一点点内存和几行代码。谢谢! – Dom 2012-04-26 10:16:43

0

那么几个小时的研究后,我想出了下面连接到文本菜单的项目选择事件监听器。我相信必须有更好的方式来做到这一点,但在此之前...

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为您的输入。这让我走上了寻找孩子的正确道路。

+1

这不是一个通用的解决方案,如果您碰巧更换容器或孩子,它会中断。 – iND 2012-04-25 23:27:57

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.targetevent.currentTarget也应该持有菜单项的对象,所以你也可以只是循环到这些对象,看看是他们。