2011-04-29 28 views
0

我會重新寫這個問題更清楚。將DisplayObjectContainer分解爲Flex組件...如何?

我想從Flash的類文件到生成器。

該類中的所有內容都位於名爲mainContainer的Sprite中。現在我試圖獲得將main類的圖形保存到Flex應用程序中的`mainContainer'。

這被證明是一個問題,因爲它們有很多不同的方式(看起來要進行大量的Google搜索)。

首先我聲明,內帶一個圖像的MXML畫布(因爲我讀會的工作):

<mx:Canvas x="268" y="10" width="756" height="680" id="canvas"> 
    <mx:Image id="spriteLayer" x="268" y="0" width="756" height="700" scaleContent="false" autoLoad="true"> 

    </mx:Image> 
</mx:Canvas>} 

好了,我的計劃是,然後再通過圖像參考她的spriteLayer I類」米試圖運行:

 
      import includes.Spirograph; 
      public var spiro:Spirograph = new Spirograph(spriteLayer); 

不幸的是,永遠只能通過null入萬花尺類:

 
     function Spirograph(canvasImage:Image):void 
     { 
      this.canvas = canvasImage; 
      mainContainer.graphics.beginFill(0xFFFFFF); 
      mainContainer.graphics.drawRect(290, 0, 670, 700); 
      mainContainer.graphics.endFill(); 

      ui.addChild(mainContainer); 
      canvas.addChild(ui); 
}

不知道該怎麼做。

非常感謝。

+0

對格式不好的道歉,看起來SO代碼突出顯示不起作用。 – Alex 2011-04-29 22:21:52

+0

@AlexW當格式化代碼使用'大括號'符號時;而不是'報價'符號。我在您的帖子中重新設置了代碼格式。我不確定如果你不知道這是否是一個暫時的問題;但現在看來我們很好。 – JeffryHouser 2011-04-29 22:40:09

+0

我不清楚問題是什麼。您的問題似乎將MXML與ACtionScript混合在一起,就好像這些線路清晰地同步運行一樣;當這是不可能的。如果您可以提供更多的上下文或深入的代碼,它可能會有所幫助。 – JeffryHouser 2011-04-29 22:41:58

回答

2

我認爲你需要在Flex Component LifeCycle讀了。當new Spirograph(spriteLayer)代碼調用時,最有可能spriteLayer組件尚未創建或初始化。該代碼何時被調用?

Flex組件LifeCycle是一系列創建Flex UI的方法和事件。你可以重寫這些方法,或者聽取這些事件來做'做些什麼'。直到調用createChildren方法之後纔會創建畫布和spritelayer;並在此之前定義默認屬性值。

您可以覆蓋createChildren()和做初始化有:

override protected function createChildren():void{ 
super.createChildren() 
spiro = new Spirograph(spriteLayer); 
} 

,或者你可以聽的初始化事件,並在那裏默認:

<mx:MyParentComponent initialize="onInitialize()"> 
<fx:Script> 
    protected function onInitialize():void{ 
    spiro = new Spirograph(spriteLayer); 
    } 
</fx:Script> 
</mx:MyParentComponent> 

至於另一個海報評論說,你也可以在creationComplete事件中進行初始化(如上所述),但我個人建議不要這樣做。 creationComplete事件在生命週期的最後階段分派;並且很可能您所做的更改將導致渲染器事件「重新啓動」,迫使大部分生命週期再次解析;該組件將被調整大小(measure())和元素重新定位(updateDisplayList())。建議在生命週期儘早設置默認值。

+0

這真的有所幫助,很多...一個問題,我現在如何引用類事件中的方法(按鈕單擊)。我需要按鈕在spiro實例中激發一個方法......非常感謝! – Alex 2011-04-30 08:40:15

+0

好吧,搞清楚了,歡呼! – Alex 2011-04-30 08:52:36

1

針對Flex 4 - 使用http://docs.huihoo.com/flex/4/spark/core/SpriteVisualElement.html

你的精靈,如果它是一個自定義類擴展精靈延長SpriteVisualElement是代替。 否則只是將它填充到UIComponent中,因爲UIComponent支持addChild,而它可以像flex的正常控件(addElement)一樣在flex中處理等。

到目前爲止,示例如果此sprite嵌入到具有符號的flash swc中SpriteTest的名稱。在Flex中,你可以把它添加到像洙另一個組件...

在MXML放UIComponent,而給它一個id ...都說ucSpriteHolder 腳本,VAR mcMySprite:雪碧=新SpriteTest(); ucSpriteHolder.addChild(mcMySprite)

+0

我沒有使用嵌入的Sprite。我可以做?我不能只使用類庫嗎?我不使用任何設計的符號,它都是代碼。 – Alex 2011-04-30 00:04:16

+0

最好,最簡單的方法是爲你的課,擴展SpriteVisualElement。然後,您可以像使用其他Flex組件一樣在Flex中使用它。 – JTtheGeek 2011-05-02 19:48:00

+0

非常感謝您的信息,我意識到我不應該使用Flex,這不是在這種情況下工作的正確工具。現在堅持使用Flash hacker;) – Alex 2011-05-02 21:48:06

0

如果你正在做public var spiro:Spirograph = new Spirograph(spriteLayer);<fx:Script>標籤內,它移動到畫布creationComplete事件處理程序應該幫助

+0

Initialize事件對於初始化來說是一個更好的選擇;我解釋了爲什麼在我的答案。大多數人似乎使用creationComplete處理程序作爲「構造函數」樣式變量,但事實上並非如此。在這種情況下,它可能會強制重新執行主生命週期方法,這對效率不利。 – JeffryHouser 2011-04-30 03:28:16

+0

@ www.Flextras.com - 我更喜歡使用'creationComplete'來處理組件內部計算的實際寬度/高度。然而,感謝評論,這是一個有用的優化,對於其他每一種情況 – www0z0k 2011-04-30 04:42:52