2012-06-13 20 views
0

當創建一個簡單的Flex 4.6應用程序,其中,所述creationComplete處理程序看起來像這樣:土坯撓曲火花組圖形消失上的addEventListener

protected function creationCompleteHandler(event:FlexEvent):void { 
    var groupVisible : Group = new Group(); 
    groupVisible.graphics.beginFill(0xff0000); 
    groupVisible.graphics.drawCircle(100, 100, 50); 
    groupVisible.graphics.endFill(); 
    addElement(groupVisible); 

    var groupInvisible : Group = new Group(); 
    groupInvisible.graphics.beginFill(0x0000ff); 
    groupInvisible.graphics.drawCircle(200, 100, 50); 
    groupInvisible.graphics.endFill(); 
    addElement(groupInvisible); 
    groupInvisible.addEventListener(MouseEvent.CLICK, function(event:MouseEvent):void {trace("click");}); 
} 

第一groupVisible.graphics內容(紅色圓圈100,100)被吸入。 第二組的無形圖形內容(200,200處的藍色圓圈)未畫出

這取決於該添加的EventListener。

任何想法?

+0

我忘了說,任何其他添加元素(如標籤)渲染儘管groupInvisible。 –

+1

這非常奇怪,也許是一個錯誤。不過,Group類的全部重點不是放置任何圖形,而是一個輕量級的佈局容器。這段代碼肯定違背了這個想法的含義。爲什麼不使用[Ellipse](http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/spark/primitives/Ellipse.html)繪製圖形? – RIAstar

+0

你有沒有考慮在createChildren()而不是creationComplete處理程序中創建子項?我絕對推薦您閱讀Flex組件生命週期。也就是說,你的組都沒有大小(沒有設置「寬度」和「高度」)。藍色的圓圈可以在屏幕外畫出來嗎?另外,這兩組的父容器是什麼?什麼是佈局? – JeffryHouser

回答

3

如果切換到SpriteVisualElement而不是Group,則會顯示兩個項目。另外,鼠標點擊事件實際上將從Sprite/SpriteVisualElement派發,而它們不會從容器派發。由於Click事件冒泡,因此可以從組內的元素分派,並在組級別上進行偵聽。但是,圖形不會分派點擊事件。

無論如何,這裏是一些代碼:

<?xml version="1.0" encoding="utf-8"?> 
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
         xmlns:s="library://ns.adobe.com/flex/spark" 
         xmlns:mx="library://ns.adobe.com/flex/mx"> 
    <fx:Declarations> 
     <!-- Place non-visual elements (e.g., services, value objects) here --> 
    </fx:Declarations> 

    <fx:Script> 
     <![CDATA[ 
      import mx.events.FlexEvent; 

      import spark.core.SpriteVisualElement; 


      protected function onMouseClick(event:MouseEvent):void{ 
       trace('click'); 
      } 

      override protected function createChildren():void{ 
       super.createChildren(); 
       var groupVisible :SpriteVisualElement = new SpriteVisualElement(); 

//    var groupVisible : Group = new Group(); 
       groupVisible.graphics.beginFill(0xff0000); 
       groupVisible.graphics.drawCircle(100, 100, 50); 
       groupVisible.graphics.endFill(); 
       groupVisible.addEventListener(MouseEvent.CLICK, onMouseClick); 
       addElement(groupVisible); 

//    var groupInvisible : Group = new Group(); 
       var groupInvisible : SpriteVisualElement = new SpriteVisualElement(); 
       groupInvisible.graphics.beginFill(0x0000ff); 
       groupInvisible.graphics.drawCircle(200, 100, 50); 
       groupInvisible.graphics.endFill(); 
//    groupInvisible.addEventListener(MouseEvent.CLICK, onMouseClick); 
       groupInvisible.addEventListener(MouseEvent.CLICK, function(event:MouseEvent):void {trace("click");}); 
       addElement(groupInvisible); 

      } 

     ]]> 
    </fx:Script> 

</s:WindowedApplication> 
+3

很好的答案。我正要提交一個類似的。只是想我會提到這個「問題」是由設計發生的。當「組」具有鼠標監聽器時,它會向組添加「背景」,以便可以在混合器的「透明」區域上註冊鼠標事件。這是掩蓋或擦除你正在繪製的東西。 –

+0

@SunilD。良好的評論;)不知道這一點。 – RIAstar

+0

@SunilD。你說什麼是有道理的,但我運行最初提供的代碼(使用組)click事件不派遣。所以,有些事情我不明白。 – JeffryHouser