AS3中的异步图像加载

时间:2013-01-20 19:00:14

标签: image actionscript-3 asynchronous

据我所知,图像将在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类,它将加载我需要的所有图像。 在这种情况下,如何在加载完成后让所有其他类知道?

我发送活动吗?在这种情况下,最佳做法是什么?

提前致谢,

Praskaton

2 个答案:

答案 0 :(得分:1)

您很可能想要创建队列并将图像路径添加到队列中。然后在完成每个图像加载后,继续执行队列中的下一个项目。加载所有图像后,您将发送一个COMPLETE事件或类似的东西,让您的应用知道它已全部完成。

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

答案 1 :(得分:0)

添加@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{ }

}