繁体   English   中英

在AS3中异步加载图片

[英]Asynchronous image loading in AS3

我知道图像将在AS3中异步加载,并且应该使用事件和事件侦听器来处理同步。

因此,在一个简单的情况下,它看起来像这样:

var loader : Loader = new Loader();
var im_file: URLRequest = new URLRequest ("imfile.png");
loader.load(im_file);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loading_complete);

function loading_complete (e : Event) : void
{ // ... do smt with your loaded data // }

我想做的是有一个PreLoader类,它将预先加载我需要的所有图像。 在这种情况下,加载完成后如何让所有其他类知道?

我是否派遣活动? 在这种情况下,最佳做法是什么?

提前致谢,

普拉斯卡顿

您最有可能想要创建队列并将图像路径添加到队列。 然后,在完成每个图像的加载之后,您进入队列中的下一项。 加载所有图像后,您将调度COMPLETE事件或类似的事件,以通知您的应用程序已完成。

检查QueueLoaderCasalib以了解它们如何实现单个或批量图像加载。

除了@Boon提供的答案外,这就是如何实际设置图像队列的方法。

首先,您需要一个列表,其中将存储仍需要加载的所有图像。 这使您可以轻松定义所需的图像。 可以是“队列”:

var queue:Array = [
    "http://interfacelift.com/wallpaper/previews/03177_orionnebulaintheinfrared@2x.jpg",
    "http://interfacelift.com/wallpaper/previews/03175_purpleclouds@2x.jpg",
    "http://interfacelift.com/wallpaper/previews/03173_goodmorning2013@2x.jpg"
];

接下来要做的是设置我们正在做的事情的“核心”方法。 它将处理加载下一张图像,并在队列为空时通知我们。 看起来像这样:

function loadNext():void
{
    if(queue.length > 0)
    {
        // Notice here that we use .pop() on the queue, which will select and
        // remove the last item from queue.
        var req:URLRequest = new URLRequest( queue.pop() );
        var photo:Loader = new Loader();

        photo.load(req);
        photo.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);
    }
    else
    {
        // The queue is finished - dispatch an event or whatever you fancy to
        // let the rest of the application know we're done here.
        trace("Queue finished.");
    }
}

然后当然还有我们的监听器功能来处理已加载图像的完成。 请注意,这里我们称为loadNext() -这是仅在当前加载的图像完成后才开始在队列中加载下一个图像的关键。

function loadComplete(e:Event):void
{
    addChild(e.target.content as Bitmap);


    // Begin loading next image in the queue.
    loadNext();
}

当然,要开始该过程,我们只需使用它,它可以立即通知我们如果队列为空,队列已完成,或者开始按顺序加载图像。

// Start loading the queue.
loadNext();

附加/整理:

如果您希望能够回收此代码或整理一下代码,则可以轻松地将其放入类中。 该类可以称为ImageQueue ,其结构将包含上述queue数组, loadNext()方法和loadComplete()方法。 它还可以具有add()方法,用于以一种更简洁的方式将图像最初添加到队列中。

这是该课程的基础,如果您有兴趣,可以结束学习:

public class ImageQueue
{

    private var _queue:Array = [];

    public function add(image:String):void{ }
    public function loadNext():void{ }

    private function _loadComplete(e:Event):void{ }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM