как загрузить несколько внешних изображений; получение не может преобразовать в класс - PullRequest
0 голосов
/ 16 июля 2009

Я пытаюсь загрузить кучу (около 100) изображений в память, чтобы я мог отображать их в разное время. Первоначально я просто вставил их, но это, конечно, привело к тому, что файл SWF оказался больше, чем я хотел. Так что теперь я пытаюсь изменить его, чтобы загрузить их в фоновом режиме, потому что они не нужны сразу.

Вероятно, есть много проблем с этим. В настоящее время я получаю сообщение об ошибке «Ошибка типа: ошибка 1034: сбой приведения типа: невозможно преобразовать« foo.jpg »в класс».

Я уже некоторое время гуглю, предполагая, что загрузка внешнего изображения - обычное дело. Вот где я получил код 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 ]

1 голос
/ 17 июля 2009

Здесь может происходить несколько вещей, в зависимости от того, чего вы пытаетесь достичь.

Хотя можно загружать растровые данные и создавать из них объекты Class для последующего использования, чаще загружать растровые данные и просто сохранять растровые изображения, поскольку вряд ли вам захочется создать несколько экземпляров растровых данных за один раз. вы загружаете его по многим причинам, не в последнюю очередь это накладные расходы памяти.

Предложение Алекса об использовании 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. Сохраните байты загруженного загрузчиком результата в словаре изображений.

Как только загрузка будет завершена, у вас должен быть пригодный для использования словарь, снабженный ключами URL ваших изображений (или именами файлов, или как вам угодно), содержащий каждый отдельный экземпляр изображения. Оттуда, если вам нужно создать объекты Class (например, для использования в качестве пользовательских курсоров и т. Д.), Вы можете - отправлять сообщения обратно, если это то, что вы пытаетесь сделать, и мы подберем это оттуда.

0 голосов
/ 17 июля 2009

Вы должны попробовать массовый загрузчик . Я использовал его в нескольких проектах, и он работает довольно хорошо. Просто не забудьте очистить его после этого, потому что это может привести к повреждению памяти и вызвать особенно неприятную утечку при загрузке 100 изображений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...