使用位图图像时,可以异步解码和加载位图图像,以改善应用程序的感知性能。在许多情况下,异步解码位图图像所需的时间可能和同步解码图像相同。但是,在关联的
Loader
对象发送
COMPLETE
事件之前,位图图像会在单独的线程中进行解码。因此,您可以在加载较大的图像后,对其进行异步解码。
借助
flash.system
包中的
ImageDecodingPolicy
类,您可以指定位图加载方案。默认加载方案为异步。
位图解码策略
|
位图加载方案
|
说明
|
ImageDecodingPolicy.ON_DEMAND
|
同步
|
在访问图像数据时,对加载的图像进行解码。
使用此策略可以解码较小的图像。如果您的应用程序不依赖复杂的效果或过渡,则也可以使用此策略。
|
ImageDecodingPolicy.ON_LOAD
|
异步
|
在加载时,在调度
COMPLETE
事件之前对加载的图像进行解码。
此策略是处理较大(大于 10 MP)图像的理想之选。当开发具有页面过渡效果的基于 AIR 的移动应用程序时,使用此位图加载策略可以改善应用程序的感知性能。
|
注:
如果加载的文件是位图图像,并且使用的解码策略为
ON_LOAD
,则该图像将在
COMPLETE
事件调度之前进行异步解码。
以下代码显示了
ImageDecodingPolicy
类的用法:
var loaderContext:LoaderContext = new LoaderContext();
loaderContext.imageDecodingPolicy = ImageDecodingPolicy.ON_LOAD
var loader:Loader = new Loader();
loader.load(new URLRequest("http://www.adobe.com/myimage.png"), loaderContext);
您仍然可以通过
Loader.load()
和
Loader.loadBytes()
方法使用
ON_DEMAND
解码。但是,所有其他使用
LoaderContext
对象作为参数的方法,将忽略传递的任何
ImageDecodingPolicy
值。
下面的示例显示了同步和异步解码位图图像的差异:
package
{
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.net.URLRequest;
import flash.system.ImageDecodingPolicy;
import flash.system.LoaderContext;
public class AsyncTest extends Sprite
{
private var loaderContext:LoaderContext;
private var loader:Loader;
private var urlRequest:URLRequest;
public function AsyncTest()
{
//Load the image synchronously
loaderContext = new LoaderContext();
//Default behavior.
loaderContext.imageDecodingPolicy = ImageDecodingPolicy.ON_DEMAND;
loader = new Loader();
loadImageSync();
//Load the image asynchronously
loaderContext = new LoaderContext();
loaderContext.imageDecodingPolicy = ImageDecodingPolicy.ON_LOAD;
loader = new Loader();
loadImageASync();
}
private function loadImageASync():void{
trace("Loading image asynchronously...");
urlRequest = new URLRequest("http://www.adobe.com/myimage.png");
urlRequest.useCache = false;
loader.load(urlRequest, loaderContext);
loader.contentLoaderInfo.addEventListener
(Event.COMPLETE, onAsyncLoadComplete);
}
private function onAsyncLoadComplete(event:Event):void{
trace("Async. Image Load Complete");
}
private function loadImageSync():void{
trace("Loading image synchronously...");
urlRequest = new URLRequest("http://www.adobe.com/myimage.png");
urlRequest.useCache = false;
loader.load(urlRequest, loaderContext);
loader.contentLoaderInfo.addEventListener
(Event.COMPLETE, onSyncLoadComplete);
}
private function onSyncLoadComplete(event:Event):void{
trace("Sync. Image Load Complete");
}
}
}
有关不同解码策略的效果说明,请参阅
Thibaud Imbert:Adobe Flash 运行时中的异步位图解码