Загрузка нескольких растровых изображений с одной и той же функцией - PullRequest
0 голосов
/ 15 марта 2012

У меня возникла основная проблема с загрузкой растрового изображения из URLRequest.
Проблема в том, что загрузка растрового изображения состоит в большом количестве кода, чтобы писать его каждый раз, когда я хочу загрузить изображение.Поэтому я подумал о некоторой функции:

var bitmap1:Bitmap = bitmapForURL("test1.gif");
var bitmap2:Bitmap = bitmapForURL("test2.gif");
function bitmapForURL(url:String):Bitmap
{
    var loader:Loader = new Loader();
    loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
    var request:URLRequest = new URLRequest(url);
    loader.x = size * numChildren;
    loader.load(request);
    return Bitmap(loader);
}

К сожалению, в конце функции растровое изображение еще не создано.-> НЕ РАБОТАЕТ
Затем я читаю о Event.Complete-Listener, но в этом случае я теряю ссылку на мои bitmap1 и bitmap2.

    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, ioCompleteHandler);

Мой вопрос: как можноя реализую функцию imageLoader, которая возвращает мне растровое изображение?

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 16 марта 2012

Примерно так должно работать:

public class BitmapLoader
{
    private var m_loaders:Dictionary = new Dictionary( true );

    public function loadImage( url:String, callback:Function ):void
    {
        // create our request and loader
        var request:URLRequest  = new URLRequest( url );
        var loader:Loader       = new Loader;
        loader.contentLoaderInfo.addEventListener( Event.COMPLETE, this._onComplete );

        // add the callback to our dictionary
        this.m_loaders[loader] = callback;

        // load it
        loader.load( request );
    }

    private function _onComplete( e:Event ):void
    {
        // get our loader
        var loaderInfo:LoaderInfo   = ( e.target as LoaderInfo );
        var loader:Loader           = loaderInfo.loader;

        // remove the event listener
        loaderInfo.removeEventListener( Event.COMPLETE, this._onComplete );

        // call our function
        if( loader in this.m_loaders )
        {
            // call our callback
            this.m_loaders[loader]( loaderInfo.content as Bitmap );

            // remove the loader from the dictionary
            this.m_loaders[loader] = null;
            delete this.m_loaders[loader];
        }
        else
            trace( "We don't have a callback for the loader" );
    }
}

Как уже упоминалось, Loader.load() является асинхронным, поэтому вам придется работать с обратными вызовами (или событиями, или сигналами).Это простой класс, который хранит загрузчики как ключ в словаре со значением в качестве обратного вызова, который мы хотим вызвать.

Вы можете дополнительно расширить его, чтобы он справлялся с несколькими загрузками в одном растровом изображении (возвращение загруженного растрового изображения или наличие нескольких прослушивателей для одной загрузки) и т. д.

...