使用相同的功能加载多个位图

时间:2012-03-15 16:58:47

标签: actionscript-3 bitmap loader

我从URLRequest加载Bitmap时遇到了一个基本问题 问题是,加载一个Bitmap是为了在每次我想加载一个Image时编写它的代码。所以我想到了一些功能:

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

不幸的是,在函数结束时,Bitmap尚未创建。 - >不工作
然后我读了一下Event.Complete-Listener,但在这种情况下,我将引用遗漏回我的bitmap1和bitmap2。

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

我的问题是:我如何实现一个imageLoader函数,它能让我返回一个位图?

感谢您的帮助!

1 个答案:

答案 0 :(得分: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()是异步的,因此您必须使用回调(或事件或信号)。这是一个简单的类,它将加载器存储为Dictionary中的键,其值为我们要调用的回调。

你可以进一步扩展它,以便它可以处理同一个位图的多个加载(返回加载的Bitmap,或者有多个监听器加载一个)等等