2009-06-22 51 views
1

我想在編譯時嵌入一些圖像,所以最終只有一個swf。 他們需要在數組內部,因爲我需要以編程方式修改它們,它們可以是100個圖像。不能使用柔性,因爲我要保持動作的整體功能(又名使較小的文件)Actionscript嵌入數組

我發現如何做到這一點的彎曲:

... 
<mx:Array id="test"> 
    <mx:Image id="image0" source="@Embed(source='../../../lib/Images033,jpg')" /> 
    <mx:Image id="image1" source="@Embed(source='../../../lib/Images034,jpg')" /> 
    <mx:Image id="image2" source="@Embed(source='../../../lib/Images035,jpg')" /> 
    <mx:Image id="image3" source="@Embed(source='../../../lib/Images036,jpg')" /> 
</mx:Array> 
... 
addChild(test[1] as something); 
... 

因此,沒有人知道該怎麼做上面的,但只是在Actionscript?

非常感謝。

回答

3

好吧,無論如何,您需要爲每個要嵌入的東西提供一條Embed語句,所以您將無法真正解決這個問題。但是,如果你更願意處理腳本中的一切,你可以做這樣的事情(這是一個AIR應用程序,但在WindowedApplication標籤之間的所有內容應在純醇中工作」的Flex應用程序):

<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" initialize="onInitialize()"> 

    <mx:Script> 
     <![CDATA[ 

      import mx.controls.Image; 

      private var images:Array; 
      private const IMAGE_COUNT:uint = 5; 

      [Embed(source='Image0.png')] 
      private var Image0:Class; 

      [Embed(source='Image1.png')] 
      private var Image1:Class; 

      [Embed(source='Image2.png')] 
      private var Image2:Class; 

      [Embed(source='Image3.png')] 
      private var Image3:Class; 

      [Embed(source='Image4.png')] 
      private var Image4:Class; 

      private function onInitialize():void 
      { 
       images = new Array(IMAGE_COUNT); 

       // Populate your array with Class references to embedded imagery 
       for (var i:int = 0; i < IMAGE_COUNT; i++) 
       { 
        images[i] = this["Image" + i]; 
       } 
      } 

      override protected function createChildren():void 
      { 
       super.createChildren(); 

       // Add your children to the display list 
       for (var i:int = 0; i < IMAGE_COUNT; i++) 
       { 
        var img:Image = new Image(); 
        img.source = images[i]; 

        addChild(img); 
       } 
      } 

     ]]> 
    </mx:Script> 

</mx:WindowedApplication> 

所以基本上在確定圖像在編譯時嵌入並根據某種數字方案命名(在本例中,僅附加索引)之後,您正在做的是使用類引用填充數組,然後實例化並將它們添加到組件生命週期的createChildren()階段期間的顯示列表。

這裏有一些深奧的東西在這裏,所以如果你不是很瞭解所有的東西,請隨時評論回來,我會留意一些事情。但是這是經過測試的代碼,並且對於你而言應該工作得非常好,因爲迄今爲止你已經解釋了你的需求。

+1

你應該能夠將嵌入式圖像類直接放入像這樣的數組中: private var images:Array == [Image0,Image1,Image2,Image3,Image4]; 您可以通過ImageN靜態Image0,如果這不起作用。 – joshtynjala 2009-06-23 20:18:15

+1

其實,它們可能需要是const而不是var。 – joshtynjala 2009-06-23 20:18:46

+1

沒錯,如果你不喜歡onInitialize中的for循環,那麼可以使用括號表示法。正如他們所說,其中一個是六個。 ;) – 2009-06-23 21:05:04

3

我認爲一些澄清是必要的,以回答你的問題。

首先,您發佈的代碼是MXML(不是Flex)。 MXML只是一種編寫ActionScript的方法,無需瞭解ActionScript。如果使用ActionScript編寫代碼,它還可以消除許多工作。當Flex創建SWF時,它會查看MXML並在幕後創建ActionScript。

其次,我們大多數人稱之爲'Flex'的部分有兩部分。 FlexBuilder是您編寫Flex應用程序的應用程序,並且有Flex。 Flex基本上只是一組額外的ActionScript庫,與基本ActionScript語言相比,它爲我們提供了許多附加功能。

我認爲你在調用MXML'Flex'。據我所知,值得一提的是,使用MXML不會增加文件大小,因爲在創建SWF之前將MXML轉換爲ActionScript。

因此,您的問題的最佳答案可能是繼續使用MXML。

如果不是的話,雖然:

可通過在與所述對象類組合使用嵌入元數據標籤嵌入圖像和其他資產在ActionScript。

您可以在Adobe的「高級Flex編程」文檔的這一部分中看到一個很好的例子。

http://livedocs.adobe.com/flex/3/html/help.html?content=embed_4.html

然而,這將是真的乏味做就是上百張圖片。甚至比在MXML中做到這一點更爲重要。我強烈建議在運行時以編程方式加載它們。這將會少得多的代碼,並且用戶的下載時間要小得多,等等。

希望這會有幫助。

+1

在運行時加載真的是最好的方法去... 儘管使用MXML導致更大的文件,但由於flex框架非常大(儘管框架緩存可以提供幫助),而編寫無框架的MXML並不是微不足道的,儘管有一種方法:http://www.flashdevelop.org/community/viewtopic.php?f=9&t=4672 ... – back2dos 2009-06-22 19:00:36

+1

@ back2dos:感謝您的評論。我可能應該說,即使MXML不一定會導致較大的文件大小,但使用MXML肯定會產生這種效果,因爲對最終結果ActionScript的控制非常少。 Ben Throop在http://stackoverflow.com/questions/264043/what-overhead-is-there-of-using-an-mxml-file-in-flex-vs-a-plain-actionscript上給出了一個很好的解釋。 -cla – 2009-06-22 19:50:16

+0

如果刪除所有mxml代碼,則可以保存爲100k。 至於寫很多代碼,我不介意,因爲我可以寫一個腳本來這樣做。 嵌入所有圖像的原因是我想只有一個SWF文件,所以我可以通過電子郵件發送。 (加上它也有助於隱藏我的心愛的圖像從其他人民的手哈哈哈)。 無論如何,非常感謝您的回答。 – StfnoPad 2009-06-24 10:18:52