Caricamento dinamico di contenuto di visualizzazione

Flash Player 9 e versioni successive, Adobe AIR 1.0 e versioni successive

È possibile caricare una delle seguenti risorse di visualizzazione esterne in un'applicazione ActionScript 3.0:

  • File SWF creato in ActionScript 3.0 (Sprite, MovieClip o qualsiasi altra classe che estenda Sprite). Nelle applicazioni AIR su iOS, solo i file SWF che non contengono bytecode ActionScript possono essere caricati. Questo significa che i file SWF contenenti dati incorporati, ad esempio immagini e suoni, possono essere caricati, mentre i file SWF contenenti codice eseguibile no.

  • File di immagine (inclusi file JPG, PNG e GIF).

  • File SWF AVM1 (file SWF scritto in ActionScript 1.0 o 2.0). (non supportato nelle applicazioni AIR per dispositivi mobili)

Per caricare queste risorse è necessario utilizzare la classe Loader.

Caricamento di oggetti di visualizzazione

Gli oggetti Loader vengono utilizzati per caricare file SWF e file di immagini nelle applicazioni. La classe Loader è una sottoclasse della classe DisplayObjectContainer. Un oggetto Loader può contenere nel proprio elenco di visualizzazione un solo oggetto di visualizzazione secondario, vale a dire l'oggetto di visualizzazione che rappresenta il file SWF o di immagine che carica. Quando aggiungete un oggetto Loader nell'elenco di visualizzazione (come illustrato nel codice seguente), viene aggiunto anche l'oggetto di visualizzazione secondario caricato:

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

Una volta caricato il file SWF o l'immagine, potete spostare l'oggetto di visualizzazione caricato in un altro contenitore di oggetti di visualizzazione, come l'oggetto DisplayObjectContainer del contenitore nell'esempio seguente:

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);  
}

Monitoraggio dello stato di avanzamento del caricamento

Una volta avviato il caricamento del file, viene creato un oggetto LoaderInfo. L'oggetto LoaderInfo contiene informazioni che includono lo stato di avanzamento del caricamento, gli URL del loader e del contenuto caricato, il numero totale di byte del contenuto multimediale e l'altezza e larghezza nominali dello stesso. L'oggetto LoaderInfo invia inoltre eventi relativi al monitoraggio dello stato di avanzamento del caricamento.

Nel diagramma seguente sono illustrati i diversi usi dell'oggetto LoaderInfo: per l'istanza della classe principale del file SWF, per un oggetto Loader e per un oggetto caricato dall'oggetto Loader:

LoaderInfo è accessibile come una proprietà dell'oggetto Loader e dell'oggetto di visualizzazione caricato. Non appena il caricamento viene avviato, è possibile accedere all'oggetto LoaderInfo mediante la proprietà contentLoaderInfo dell'oggetto Loader. Al termine del caricamento dell'oggetto di visualizzazione, l'oggetto LoaderInfo risulta comunque accessibile come proprietà dell'oggetto di visualizzazione caricato mediante la proprietà loaderInfo dell'oggetto di visualizzazione. La proprietà loaderInfo dell'oggetto di visualizzazione caricato fa riferimento allo stesso oggetto LoaderInfo della proprietà contentLoaderInfo dell'oggetto Loader. In altre parole, un oggetto LoaderInfo è condiviso da un file di oggetto caricato e dall'oggetto Loader che lo ha caricato.

Per accedere alle proprietà del contenuto caricato, è necessario aggiungere un listener di evento all'oggetto LoaderInfo, come nel codice seguente:

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; 
}

Per ulteriori informazioni, vedete Gestione degli eventi.

Impostazione del contesto di caricamento

Quando caricate un file esterno in Flash Player mediante il metodo load() o loadBytes() della classe Loader, potete eventualmente specificare un parametro context. Tale parametro è un oggetto di LoaderContext.

La classe LoaderContext include tre proprietà che consentono di definire il contesto di utilizzo del contenuto caricato:

  • checkPolicyFile: utilizzate questa proprietà solo per caricare file di immagine (non file SWF). Se questa proprietà viene impostata su true, l'oggetto Loader cerca nel server di origine un file di criteri (vedete la sezione Controlli del sito Web (file di criteri)). Ciò è necessario unicamente per il contenuto proveniente da domini diversi da quello del file SWF contenente l'oggetto Loader. Se il server concede l'autorizzazione di accesso al dominio di Loader, ActionScript è in grado di accedere ai dati dell'immagine caricata dai file SWF presenti nel dominio di Loader; in altre parole, potete usare il comando BitmapData.draw() per accedere ai dati dell'immagine caricata.

    Notate che un file SWF appartenente a un dominio diverso da quello dell'oggetto Loader può chiamare il metodo Security.allowDomain() per consentire l'accesso a un dominio specifico.

  • securityDomain: utilizzate questa proprietà solo per caricare file SWF (non file di immagine). Specificate questa proprietà per un file SWF appartenente a un dominio differente da quello del file contenente l'oggetto Loader. Se specificate questa opzione, Flash Player verifica l'esistenza di un file dei criteri dei domini e, se lo trova, consente ai file SWF dei domini autorizzati nel file dei criteri dei domini di eseguire scambi di script con il contenuto SWF caricato. Potete specificare flash.system.SecurityDomain.currentDomain per questo parametro.

  • applicationDomain: utilizzate questa proprietà solo per il caricamento di un file SWF scritto in ActionScript 3.0 (non un'immagine o un file SWF scritto in ActionScript 1.0 o ActionScript 2.0). Quando caricate il file, potete specificare che il file venga incluso nello stesso dominio applicazione dell'oggetto Loader impostando il parametro applicationDomain su flash.system.ApplicationDomain.currentDomain. L'inserimento del file SWF caricato nello stesso dominio dell'applicazione consente di accedere direttamente alle relative classi. Ciò può risultare utile se caricate un file SWF con contenuti multimediali incorporati, ai quali potrete accedere attraverso i relativi nomi di classi associati. Per ulteriori informazioni, vedete Operazioni con i domini applicazione.

Di seguito è riportato un esempio di controllo di un file di criterio nel corso del caricamento di una bitmap da un altro dominio:

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);

Segue un esempio di verifica di un file dei criteri dei domini durante il caricamento di un file SWF da un altro dominio, al fine di collocare il file nella stessa funzione di sicurezza sandbox dell'oggetto Loader. Inoltre, il codice inserisce le classi del file SWF caricato nello stesso dominio applicazione dell'oggetto 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);

Per ulteriori informazioni, vedete la classe LoaderContext nella Guida di riferimento di Adobe ActionScript 3.0 per la piattaforma Adobe Flash.

Caricamento di file SWF in AIR per iOS

Sui dispositivi iOS, vi sono restrizioni relative al caricamento e alla compilazione dei codici in fase di runtime. A causa di queste restrizioni, l'attività di caricamento di file SWF esterni nell'applicazione presenta alcune necessarie differenze:

  • Tutti i file SWF contenenti il codice ActionScript devono essere inclusi nel pacchetto dell'applicazione. Non potete caricare alcun SWF contenente codici da una fonte esterna, ad esempio una rete. Come parte della compilazione dell'applicazione, l'intero codice ActionScript in tutti i file SWF nel pacchetto dell'applicazione è compilato in codice nativo per dispositivi iOS.

  • Non è possibile caricare, scaricare e caricare nuovamente un file SWF. Se tentate di eseguire questa operazione, viene rilevato un errore.

  • Caricare nella memoria e poi scaricare è un comportamento tipico delle piattaforme desktop. Se caricate e successivamente scaricate un file SWF, tutte le risorse visive contenute nel file SWF vengono scaricate dalla memoria. Tuttavia, qualsiasi riferimento a una classe ActionScript nel file SWF caricato resta in memoria e vi potete accedere con codice ActionScript.

  • Tutti i file SWF devono essere caricati nello stesso dominio applicazione del file SWF principale. Non si tratta del comportamento predefinito, quindi per ciascun file SWF caricato è necessario creare un oggetto LoaderContext in cui è specificato il dominio applicazione principale e trasferire tale oggetto LoaderContext nella chiamata del metodo Loader.load(). Se cercate di caricare un file SWF in un dominio applicazione diverso dal dominio applicazione SWF principale, viene rilevato un errore. Lo stesso accade anche se il file SWF caricato contiene solo risorse visive e nessun codice ActionScript.

    Nel seguente esempio viene mostrato il codice da utilizzare per caricare un file SWF dal pacchetto dell'applicazione nel dominio applicazione SWF principale:

    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);

Un file SWF contenente solo risorse e nessun codice può essere caricato dal pacchetto applicazione o su una rete. In entrambi i casi, il file SWF deve comunque essere caricato nel dominio applicazione principale.

Per le versioni AIR precedenti alla 3.6, il codice viene eliminato dai file SWF diversi da quelli dell'applicazione principale durante il processo di compilazione. I file SWF contenenti solo risorse visive possono essere inclusi nel pacchetto applicazione e caricati in fase di runtime, ma senza codice. Se cercate di caricare un file SWF che contiene il codice ActionScript, viene rilevato un errore. In seguito all'errore, nell'applicazione viene visualizzata una finestra di dialogo relativa all'ActionScript non compilato.

Vedere anche

Packaging and loading multiple SWFs in AIR apps on iOS

Uso delle classi ProLoader e ProLoaderInfo

Per agevolare il precaricamento della libreria condivisa remota (RSL, Remote Shared Library), Flash Professional CS5.5 introduce le classi fl.display.ProLoader e fl.display.ProLoaderInfo. Queste classi riflettono le classi flash.display.Loader e flash.display.LoaderInfo ma forniscono un'esperienza di caricamento più uniforme.

In particolare, ProLoader consente di caricare file SWF che utilizzano Text Layout Framework (TLF) con precaricamento RSL. In fase di esecuzione, i file SWF che precaricano altri file SWF o SWZ, ad esempio TLF, richiedono un file wrapper SWF solo interno. Il livello di complessità aggiuntivo imposto dal file wrapper SWF può determinare comportamenti imprevisti. ProLoader risolve la complessità di caricamento di tali file come se si trattassero di normali SWF. La soluzione usata dalla classe ProLoader è trasparente per l'utente e non richiede gestione speciale in ActionScript. Inoltre, ProLoader carica correttamente il normale contenuto SWF.

In Flash Professional CS 5.5 e versioni successive, è possibile sostituire correttamente tutti gli usi della classe Loader con la classe ProLoader. Quindi, esportate l'applicazione in Flash Player 10.2 o versioni successive in modo che ProLoader possa accedere alla funzionalità ActionScript richiesta. Potete anche utilizzare ProLoader quando fate riferimento a versioni precedenti di Flash Player che supportano ActionScript 3.0. Tuttavia, il vantaggio completo delle funzioni ProLoader è possibile solo con Flash Player 10.2 o versioni successive. Utilizzate sempre ProLoader con TLF in Flash Professional CS5.5 o versioni successive. L'uso di ProLoader non è richiesto in ambienti diversi da Flash Professional.

Importante: per file SWF pubblicate in Flash Professional CS5.5 e versioni successive, potete sempre utilizzare le classi fl.display.ProLoader e fl.display.ProLoaderInfo anziché le classi flash.display.Loader e flash.display.LoaderInfo.

Problemi risolti dalla classe ProLoader

La classe ProLoader consente di risolvere problemi che la classe Loader precedente non era progettata per gestire. Questi problemi derivano dal precaricamento RSL delle librerie TLF. In particolare, si applicano a file SWF che utilizzano un oggetto Loader per caricare altri file SWF. I problemi risolti includono i seguenti:

  • Lo script tra il file di caricamento e il file caricato non si comporta come previsto. La classe ProLoader imposta automaticamente il file SWF di caricamento come padre del file SWF caricato. Pertanto, le comunicazioni dal file SWF di caricamento vanno direttamente nel file SWF caricato.

  • L'applicazione SWF deve gestire attivamente il processo di caricamento. Questo richiede l'implementazione di eventi aggiuntivi, ad esempio added, removed, addedToStage e removedFromStage. Se l'applicazione fa riferimento a Flash Player 10.2 o versioni successive, ProLoader rimuove la necessità per questo lavoro aggiuntivo.

Aggiornamento del codice per utilizzare ProLoader anziché Loader

Poiché ProLoader riflette la classe Loader, potete facilmente passare da una classe all'altra nel codice. L'esempio seguente mostra come aggiornare il codice esistente per utilizzare la nuova 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!'); 
}

Questo codice può essere aggiornato per utilizzare ProLoader come 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!'); 
}