Actionscript嵌入了一个数组

时间:2009-06-22 15:43:52

标签: flex actionscript

我想在编译时嵌入一些图像,所以我最终只能使用一个swf。 它们需要在数组内部,因为我需要以编程方式修改它们,它们可以是100个图像。不能使用flex,因为我想将整个函数保存在actionscript中(也就是make文件更小)

我在flex中找到了如何做到这一点:

...
<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中吗?

非常感谢。

2 个答案:

答案 0 :(得分:3)

我认为有必要做一些澄清来回答你的问题。

首先,您发布的代码是MXML(不是Flex)。 MXML只是编写ActionScript而不必了解ActionScript的一种方式。如果您在ActionScript中编写代码,它还会删除您需要完成的大量工作。当Flex创建SWF时,它会查看MXML并在后台创建ActionScript。

其次,我们大多数人称之为“Flex”的部分分为两部分。有FlexBuilder,它是您编写Flex应用程序的应用程序,还有Flex。与基本的ActionScript语言相比,Flex主要是一组额外的ActionScript库,它们为我们提供了许多附加功能。

我认为你正在调用MXML'Flex'。至于它的价值,据我所知,使用MXML不会增加文件大小,因为MXML在创建SWF之前转换为ActionScript。

因此,对您的问题的最佳答案可能是继续使用MXML。

如果不是,

通过将Embed元数据标记与Class对象结合使用,可以在ActionScript中嵌入图像和其他资源。

您可以在Adobe的“高级Flex编程”文档的这一部分中看到如何执行此操作的一个很好的示例。

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

但是,对于数百张图片来说,这样做真的很麻烦。甚至比在MXML中做的更多。我强烈建议在运行时以编程方式加载它们。这将是代码少得多,并且用户的下载时间要小得多等。

希望这有帮助。

答案 1 :(得分: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()阶段实例化并将它们添加到显示列表中。

这里有一些深奥的东西,所以如果你不太了解一切,请随时回复评论,我会留意事情。但是这是经过测试的代码,并且应该对你来说非常好,因为到目前为止你已经解释了你的要求。