Carregamento dinâmico do conteúdo da exibição

Flash Player 9 e posterior, Adobe AIR 1.0 e posterior

Você pode carregar qualquer uma dos seguintes ativos de exibição externos em um aplicativo ActionScript 3.0:

  • Um arquivo SWF criado no ActionScript 3.0 - Esse arquivo pode ser uma classe Sprite, MovieClip ou qualquer classe que estende Sprite. Nos aplicativos do AIR que rodam no iOS, somente os arquivos SWF que não contêm código de byte do ActionScript podem ser carregados. Isso significa que os arquivos SWF que contêm dados incorporados, tais como imagens e som, podem ser carregados, mas não os arquivos SWF que contêm código executável.

  • Um arquivo de imagem - Isso inclui arquivos JPG, PNG e GIF.

  • Um arquivo SWF AVM1 - Arquivo SWF gravado no ActionScript 1.0 ou 2.0. (não suportado em aplicativos móveis do AIR)

Carregue esses ativos usando a classe Loader.

Carregamento de objetos de exibição

Os objetos Loader são usados para carregar arquivos SWF e de imagem em um aplicativo. A classe Loader é uma subclasse de DisplayObjectContainer. Um objeto Loader pode conter apenas um objeto de exibição filho na lista de exibição, o objeto que representa o arquivo SWF ou de imagem carregado. Quando você adiciona um objeto Loader à lista de exibição, como no código a seguir, também pode adicionar o objeto filho carregado à lista de exibição após o carregamento:

var pictLdr:Loader = new Loader(); 
var pictURL:String = "banana.jpg" 
var pictURLReq:URLRequest = new URLRequest(pictURL); 
pictLdr.load(pictURLReq); 
this.addChild(pictLdr);

Assim que o arquivo SWF ou imagem é carregado, você pode mover o objeto de exibição carregado para outro contêiner, como o objeto container DisplayObjectContainer neste exemplo:

import flash.display.*; 
import flash.net.URLRequest; 
import flash.events.Event; 
var container:Sprite = new Sprite(); 
addChild(container); 
var pictLdr:Loader = new Loader(); 
var pictURL:String = "banana.jpg" 
var pictURLReq:URLRequest = new URLRequest(pictURL); 
pictLdr.load(pictURLReq); 
pictLdr.contentLoaderInfo.addEventListener(Event.COMPLETE, imgLoaded);  
function imgLoaded(event:Event):void 
{ 
    container.addChild(pictLdr.content);  
}

Monitoramento do progresso do carregamento

Assim que o arquivo começa a ser carregado, um objeto LoaderInfo é criado. Um objeto LoaderInfo fornece informações como o progresso do carregamento, os URLs do carregador e do conteúdo carregado, o número de bytes totais para a mídia e a altura e largura nominais da mídia. O objeto LoaderInfo também envia eventos para o monitoramento do progresso do carregamento.

O diagrama a seguir mostra os diferentes usos do objeto LoaderInfo - para a ocorrência da classe principal do arquivo SWF, para um objeto Loader e para um objeto carregado por Loader:

O objeto LoaderInfo pode ser acessado como uma propriedade do objeto Loader e do objeto de exibição carregado. Assim que o carregamento começa, o objeto LoaderInfo pode ser acessado por meio da propriedade contentLoaderInfo do objeto Loader. Quando o carregamento do objeto de exibição termina, o objeto LoaderInfo também pode ser acessado como uma propriedade do objeto de exibição carregado pela propriedade loaderInfo. A propriedade loaderInfo do objeto de exibição carregado refere-se ao mesmo objeto LoaderInfo da propriedade contentLoaderInfo do objeto Loader. Em outras palavras, um objeto LoaderInfo é compartilhado entre um objeto carregado e o objeto Loader que o carregou (entre o carregador e o carregado).

Para acessar as propriedades do conteúdo carregado, adicione um ouvinte de eventos ao objeto LoaderInfo, assim como no código a seguir:

import flash.display.Loader; 
import flash.display.Sprite; 
import flash.events.Event; 
 
var ldr:Loader = new Loader(); 
var urlReq:URLRequest = new URLRequest("Circle.swf"); 
ldr.load(urlReq); 
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, loaded); 
addChild(ldr); 
 
function loaded(event:Event):void 
{ 
    var content:Sprite = event.target.content; 
    content.scaleX = 2; 
}

Para obter mais informações, consulte Manipulação de eventos.

Especificação do contexto do carregamento

Quando você carrega um arquivo externo no Flash Player ou no AIR com o método load() ou loadBytes() da classe Loader, pode especificar, se desejar, um parâmetro context. Este parâmetros é um objeto LoaderContext.

A classe LoaderContext inclui três propriedades que permitem definir o contexto de como o conteúdo carregado pode ser usado:

  • checkPolicyFile: Use essa propriedade apenas ao carregar um arquivo de imagem (não um arquivo SWF). Se você definir a propriedade como true, o Loader verificará o servidor de origem para obter um arquivo de política (consulteControles de site (arquivos de política)). Isso é necessário apenas para o conteúdo originado de domínios diferentes dos domínios do arquivo SWF que contém o objeto Loader. Se o servidor conceder permissão ao domínio de Loader, o ActionScript dos arquivos SWF do domínio de Loader poderá acessar os dados na imagem carregada; em outras palavras, você pode usar o comando BitmapData.draw() para acessar os dados na imagem carregada.

    Observe que um arquivo SWF de outros domínios que não são os do objeto Loader pode chamar Security.allowDomain() para permitir um domínio específico.

  • securityDomain: Só use essa propriedade ao carregar um arquivo SWF (não uma imagem). Especifique-a para um arquivo SWF de um domínio diferente daquele do arquivo que contém o objeto Loader. Quando essa opção é especificada, o Flash Player verifica a existência de um arquivo de política e, se existir algum, os arquivos SWF dos domínios permitidos no arquivo de política poderão cruzar o script do conteúdo SWF carregado. Você pode especificar flash.system.SecurityDomain.currentDomain como este parâmetro.

  • applicationDomain: Use essa propriedade apenas ao carregar um arquivo SWF gravado no ActionScript 3.0 (não em uma imagem ou arquivo SWF gravado no ActionScript 1.0 ou no ActionScript 2.0). Ao carregar o arquivo, você pode especificar que o arquivo seja incluído no mesmo domínio de aplicativo do objeto Loader, definindo o parâmetro applicationDomain como flash.system.ApplicationDomain.currentDomain. Colocando o arquivo SWF carregado no mesmo domínio de aplicativo, é possível acessar suas classes diretamente. Isso pode ser útil se estiver carregando um arquivo SWF que contém mídia incorporada, que pode ser acessada por meio dos nomes de classe associados. Para obter mais informações, consulte Trabalhar com domínios de aplicativo.

Veja um exemplo de busca de um arquivo de política ao carregar um bitmap de outro domínio:

var context:LoaderContext = new LoaderContext(); 
context.checkPolicyFile = true; 
var urlReq:URLRequest = new URLRequest("http://www.[your_domain_here].com/photo11.jpg"); 
var ldr:Loader = new Loader(); 
ldr.load(urlReq, context);

Veja um exemplo de busca de um arquivo de política ao carregar um SWF de outro domínio para colocar o arquivo na mesma caixa de proteção do objeto Loader. Além disso, o código adiciona as classes do arquivo SWF carregado ao mesmo domínio de aplicativo do objeto Loader:

var context:LoaderContext = new LoaderContext(); 
context.securityDomain = SecurityDomain.currentDomain; 
context.applicationDomain = ApplicationDomain.currentDomain; 
var urlReq:URLRequest = new URLRequest("http://www.[your_domain_here].com/library.swf"); 
var ldr:Loader = new Loader(); 
ldr.load(urlReq, context);

Para obter mais informações, consulte a classe LoaderContext em Referência do ActionScript® 3.0 para Adobe® Flash® Platform.

Carregamento de arquivos SWF no AIR for iOS

Nos dispositivos iOS, há restrições no código de carregamento e compilação no runtime. Devido a essas restrições, existem certas diferenças necessárias na tarefa de carregar arquivos SWF externos em seu aplicativo:

  • Todos os arquivos SWF que contenham o código ActionScript devem ser incluídos no pacote do aplicativo. Nenhum SWF com código pode ser carregado de uma fonte externa, como uma rede. Como parte do empacotamento do arquivo, todo código ActionScript em todos os arquivos SWF no pacote do aplicativo é compilado no código nativo para dispositivos iOS.

  • Não é possível carregar, descarregar e, em seguida, recarregar um arquivo SWF. Caso tente fazer isso, ocorrerá um erro.

  • O comportamento de carregar na memória e descarregar é o mesmo de plataformas de desktop. Se você carregar um arquivo SWF e, em seguida, descarregá-lo, todos os recursos visuais contidos no SWF serão descarregados da memória. Contudo, todas as referências de classe para uma classe ActionScript no SWF carregado permanecem na memória e podem ser acessadas no código ActionScript.

  • Todos os arquivos SWF carregados devem ser carregados no mesmo domínio de aplicativo do arquivo SWF principal. Como esse não é o comportamento padrão, para cada SWF que você carregar, deverá criar um objeto LoaderContext especificando o principal domínio de aplicativo e enviar esse objeto LoaderContext para a chamada de método Loader.load(). Se você tentar carregar um SWF em um domínio de aplicativo que não seja o do SWF principal, ocorrerá um erro. Isso ocorre mesmo se o SWF carregado contiver apenas recursos visuais e nenhum código ActionScript.

    O exemplo a seguir apresenta o código a ser utilizado para carregar um SWF de um pacote de aplicativo para o domínio de aplicativo do SWF principal.

    var loader:Loader = new Loader(); 
    var url:URLRequest = new URLRequest("swfs/SecondarySwf.swf"); 
    var loaderContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain, null); 
    loader.load(url, loaderContext);

Um arquivo SWF que possua apenas recursos visuais e nenhum código pode ser carregado do pacote do aplicativo ou de uma rede. Em ambos os casos, o arquivo SWF ainda assim deverá ser carregado no domínio do aplicativo principal.

No caso de versões do AIR anteriores ao AIR 3.6, todo o código é removido de SWFs diferentes do SWF do aplicativo principal durante ao processo de compilação. Os arquivos SWF que contenham somente recursos visuais podem ser incluídos no pacote do aplicativo e carregados no runtime, mas sem código. Se você tentar carregar um SWF que possua um código ActionScript, ocorrerá um erro. O erro faz com que surja uma caixa de diálogo de erro "ActionScript descompilado" no aplicativo.

Consulte também

Empacotamento e carregamento de vários SWFs em aplicativos do AIR no iOS

Uso das classes ProLoader e ProLoaderInfo

Para ajudar no precarregamento da biblioteca de compartilhamento remoto (RSL - remote shared library), o Flash Professional CS5.5 introduz as classes fl.display.ProLoader and fl.display.ProLoaderInfo. Essas classes refletem as classes flash.display.Loader and flash.display.LoaderInfo, mas proporcionam uma experiência de carregamento mais consistente.

Em particular, a classe ProLoader ajuda-o a carregar arquivos SWF que utilizam Estrutura de Layout de Texto (TLF - Text Layout Framework) com precarregamento da RSL preloading. No tempo de execução, os arquivos SWF que carregam outros arquivos SWF ou arquivos SWZ, tais como TLF, requirem um arquivo de invólucro SWF somente para uso interno. A camada extra de complexidade imposta pelo arquivo de invólucro SWF pode causar um comportamento indesejável. A classe ProLoader resolve essa complexidade no carregamento desses arquivos como se eles fossem arquivos SWF comuns. A solução usada pela classe ProLoader é transparente para o usuário e não requer nenhum processamento especial no ActionScript. Além disso, a classe ProLoader carrega o conteúdo SWF comum corretamente.

No Flash Professional CS5.5 e posteriores, é possível substituir com segurança todas as utilizações da classe Loader pela classe ProLoader. Em seguida, você pode exportar o aplicativo Flash Player 10.2 ou posgterior para que a classe ProLoader acesse a funcionalidade do ActionScript necessária. Também é possível utilizar a classe ProLoader ao definir como destino versões anteriores do Flash Player que suportam o ActionScript 3.0. Contudo, as vantagens completas dos recursos da classe ProLoader só podem ser obtidas com o Flash Player 10.2 ou posterior. Use sempre ProLoader ao usar TLF no Flash Professional CS5.5 ou posterior. A classe ProLoader não é necessária em ambientes estranhos ao Flash Professional.

Importante: Para arquivos SWF publicados no Flash Professional CS5.5 e posterior, você pode sempre usar as classes fl.display.ProLoader e fl.display.ProLoaderInfo em vez de flash.display.Loader e flash.display.LoaderInfo.

Problemas tratados pela classe Proloader

A classe ProLoader trata de problemas que a classe legada Loader não se destinava a tratar. Esses problemas decorrem do precarregamento da RSL das bibliotecas TLF. Especificamente, elas se aplicam aos arquivos SWF que usam um objeto Loader para carregar outros arquivos SWF. Os problemas tratados incluem os seguintes:

  • Os scripts entre o arquivo de carregamento e o arquivo carregado não se comportam como esperado. A classe ProLoader define automaticamente o arquivo SWF de carregamento como pai do arquivo SWF carregado. Desse modo, as comunicações do arquivo SWF de carregamento vão diretamente para o arquivo SWF carregado.

  • O aplicativo SWF deve gerenciar ativamente o processo de carregamento. Isso requer a implantação de eventos adicionais como added, removed, addedToStage e removedFromStage. Se o seu aplicativo for desenvolvido para o Flash Player 10.2 ou superior, a classe ProLoader eliminará a necessidade desse trabalho extra.

Atualizando o código para utilizar ProLoader em vez de Loader

Uma vez que a classe ProLoader reflete a classe, você pode alternar facilmente as duas classes no seu código. O exemplo a seguir mostra como atualizar um código existente para utilizar a nova classe:

import flash.display.Loader; 
import flash.events.Event; 
var l:Loader = new Loader(); 
 
addChild(l); 
l.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete); 
l.load("my.swf"); 
function loadComplete(e:Event) { 
    trace('load complete!'); 
}

Esse código pode ser atualizado para usar ProLoader como segue:

import fl.display.ProLoader; 
import flash.events.Event; 
var l:ProLoader = new ProLoader(); 
 
addChild(l); 
l.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete); 
l.load("my.swf"); 
function loadComplete(e:Event) { 
    trace('load complete!'); 
}