2012-03-15 7 views
0

J'ai eu un problème de base avec le chargement d'un bitmap à partir d'une demande d'URL.
Le problème est, que le chargement d'un bitmap est beaucoup de code pour l'écrire chaque fois que je veux charger une image. J'ai donc pensé à certaines fonctions:Charger plusieurs bitmaps avec la même fonction

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); 
} 

Malheureusement, à la fin de la fonction, le bitmap n'est pas déjà créé. -> NE FONCTIONNE PAS
Ensuite, j'ai lu sur le Event.Complete-Listener, mais dans ce cas, je perds la référence à mon bitmap1 et bitmap2. Ma question est: Comment puis-je implémenter une fonction imageLoader, qui me renvoie un bitmap?

Merci pour votre aide!

+0

Loader est une fonction asynchrone. Vous aurez besoin d'un gestionnaire d'événements complet pour le moment où les données ont été chargées. –

+0

En bref non, mais il existe des alternatives. Vous pouvez simplement renvoyer un objet 'Loader' à la place, mais même si vous l'ajoutez à la scène, l'image en cours de chargement n'a peut-être pas encore été chargée. – Taurayi

Répondre

0

Quelque chose comme cela devrait fonctionner:

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"); 
    } 
} 

Comme déjà mentionné, Loader.load() est asynchrone, vous devez travailler avec callbacks (ou des événements ou des signaux). C'est une classe simple qui stocke les chargeurs comme une clé dans un dictionnaire, avec la valeur que le rappel que nous voulons appeler.

On peut en outre étendre de sorte qu'il fait face à des charges multiples à la même bitmap (soit renvoyer le Bitmap chargé, ou ayant plusieurs écouteurs à une charge) etc etc

Questions connexes