2012-04-25 20 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也應該持有菜單項的對象,所以你也可以只是循環到這些對象,看看是他們。