如何加载几个外部图像;得到无法转换为类

时间:2009-07-16 19:38:38

标签: flex actionscript-3

我正在尝试将一堆(大约100个)图像加载到内存中,因此我可以在不同时间显示它们。最初我只是简单地嵌入了它们,但这当然导致swf文件比我想要的要大。所以现在我正在尝试更改它以在后台加载它们,因为它们不是立即需要的。

这可能有很多问题。目前的情况是,我收到的错误是“TypeError:错误#1034:类型强制失败:无法将”foo.jpg“转换为Class。”

我一直在谷歌搜索这段时间,假设加载外部图像是常见的事情。这就是我获得Loader和URLRequest代码的地方,但我显然遗漏了一些东西。也许这是由于我愚蠢的循环逻辑。

这是迄今为止的课程

public class CardImages2
    {
        public static var fooImage1:Class;
        public static var fooImage2:Class;
        public static var fooImage3:Class;
        public static var fooImage4:Class;

        private static var curImgClass:Class;

        public static function load():void {
            // map of cards and their urls
            var dict:Dictionary = new Dictionary;
            dict[fooImage1] = "fooImage1.jpg";
            dict[fooImage2] = "fooImage2.jpg";
            dict[fooImage3] = "fooImage3.jpg";
            dict[fooImage4] = "fooImage4.jpg";

            var url:String;
            var loader:Loader = new Loader();
            var urlReq:URLRequest;

            for each(var key:Class in dict) {
                url = String(dict[key]);
                curImgClass = key;
                loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadListener); 
                urlReq = new URLRequest(encodeURI(url));
                loader.load(urlReq);
            }
        }

        private static function loadListener(e:Event):void {
            curImgClass.source = Class(e.currentTarget.content);
        }
    }

2 个答案:

答案 0 :(得分:1)

这里可能会有一些事情发生,取决于你想要完成的事情。

虽然可以加载位图数据并从中创建Class对象供以后使用,但加载位图数据并存储位图更常见,因为你不太可能想要创建位图数据的多个实例一次你加载它,出于很多原因,其中最重要的是内存开销。

Alex建议使用BulkLoader是一个很好的建议,但为了说明一种解决问题的方法,我将这个例子拼凑在一起,它将三个图像作为Bitmap实例加载到Dictionary对象中:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="onCreationComplete()">

    <mx:Script>
        <![CDATA[

            private var loaders:Dictionary;
            private var images:Dictionary;

            private var imageUrls:Array = ["Image1.png", "Image2.png", "Image3.png"];

            private function onCreationComplete():void
            {
                loadImages();
            }

            private function loadImages():void
            {
                loaders = new Dictionary();
                images = new Dictionary();

                for each (var imageUrl:String in imageUrls)
                {
                    var urlLoader:URLLoader = new URLLoader();
                    urlLoader.addEventListener(Event.COMPLETE, onURLLoaderComplete);
                    urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
                    urlLoader.load(new URLRequest(imageUrl));

                    loaders[urlLoader] = imageUrl;
                }
            }

            private function onURLLoaderComplete(event:Event):void
            {                   
                var loader:Loader = new Loader();
                loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaderComplete);
                loader.loadBytes(event.target.data);

                loaders[loader.contentLoaderInfo] = loaders[event.target];
                delete loaders[event.target];
            }

            private function onLoaderComplete(event:Event):void
            {
                images[loaders[event.target]] = event.target.content;
                delete loaders[event.target];
            }

        ]]>
    </mx:Script>

    <!-- These won't bind, but should illustrate how to access the bitmaps -->
    <mx:Image source="{images['Image1.png']}" />
    <mx:Image source="{images['Image2.png']}" />
    <mx:Image source="{images['Image3.png']}" />

</mx:Application>

这是一个很好的代码,但步骤非常简单:

  1. 使用自己的URLLoader加载每个图像,使用Dictionary对象记住哪个加载器随每个图像一起运行;
  2. 当每个URLLoader返回结果时,使用Loader捕获结果的实际字节;和
  3. 将加载Loader的结果的字节存储在图像词典中。
  4. 一旦加载完成,你应该有一个可用的词典,由你的图像URL(或文件名,或任何你喜欢的)键入,包含每个单独的图像实例。从那里,如果你需要创建Class对象(例如,用作自定义游标等),你可以 - 回帖如果那是你想要做的,我们将从那里拿起它。 / p>

答案 1 :(得分:0)

您应该尝试bulk-loader。我已经在几个项目中使用过它并且效果很好。只要确保在它之后进行清理,因为它可能是一个内存耗尽,如果你加载了100张图像,可能会导致一个非常令人讨厌的泄漏。