Decodificação assíncrona de imagens de bitmap

Flash Player 11 e posterior, Adobe AIR 2.6 e posterior

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