Quando você trabalha com imagens de bitmap, pode decodificar e carregar assincronamente as imagens de bitmap a fim de aprimorar o desempenho percebido de seu aplicativo. A decodificação assíncrona de uma imagem de bitmap, em muitos casos pode durar o mesmo tempo que a decodificação síncrona da imagem. No entanto, a imagem de bitmap é decodificada em um encadeamento separado antes que o objeto
Loader
associado envie o evento
COMPLETE
. Assim, é possível decodificar assincronamente imagens maiores depois de carregá-las.
A classe
ImageDecodingPolicy
no pacote
flash.system
permite especificar o esquema de carregamento de bitmap. O esquema de carregamento padrão é síncrono.
Política de decodificação de bitmap
|
Esquema de carregamento de bitmap
|
Descrição
|
ImageDecodingPolicy.ON_DEMAND
|
Síncrono
|
As imagens carregadas são decodificadas quando os dados da imagem são acessados.
Use esta política para decodificar imagens menores. Você também pode usar esta política quando seu aplicativo não depender de efeitos e transições complexas.
|
ImageDecodingPolicy.ON_LOAD
|
Assíncrono
|
As imagens carregadas são decodificadas no carregamento, antes que o evento
COMPLETE
seja despachado.
Ideal para imagens maiores (maiores que 10 MP). Quando estiver desenvolvendo aplicativos móveis baseados no AIR com transições de página, use esta política de carregamento de bitmap para aumentar o desempenho percebido de seu aplicativo.
|
Nota:
Se o arquivo carregado for uma imagem de bitmap e a política de decodificação usada for
ON_LOAD
, a imagem será decodificada de modo assíncrono antes de o evento
COMPLETE
ser despachado.
O código a seguir mostra o uso da classe
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);
Você ainda pode usar a decodificação ON_DEMAND com os métodos
Loader.load()
e
Loader.loadBytes()
. No entanto, todos os outros métodos que obtêm um objeto
LoaderContext
como argumento ignoram qualquer valor de
ImageDecodingPolicy
passado.
O exemplo a seguir mostra a diferença entre a decodificação síncrona e assíncrona de uma imagem de bitmap:
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");
}
}
}
Para uma demonstração do efeito de diferentes políticas de decodificação, consulte
Thibaud Imbert: Decodificação de bitmap assíncrona nos tempos de execução do Adobe Flash