2012-03-15 2 views
0

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

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, но в этом случае я потерял ссылку обратно на мои битмап1 и bitmap2.

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

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

Благодарим за помощь!

+0

погрузчика является асинхронной функцией. Вам понадобится полный обработчик событий, когда данные были загружены. –

+0

Короче нет, но есть несколько альтернатив. Вместо этого вы можете просто вернуть объект «Loader», но даже если вы добавите его на сцену, загружаемое изображение может еще не загрузиться. – Taurayi

ответ

0

Что-то, как это должно работать:

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() асинхронный, так что вам придется работать с обратными вызовами (или события, или сигналы). Это простой класс, который хранит загрузчиков в качестве ключа в словаре, со значением в качестве обратного вызова, который мы хотим вызвать.

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

Смежные вопросы