ho un problema con un semplice loader che dovrebbe anticipare la visualizzazione effettiva di un swf esterno
il codice dovrebbe essere corretto o no?
Escludendo il modo semplicistico di scrivere le funzioni, senza nome e senza tipologia, il codice è corretto e fa esattamente quello che gli chiedi ovvero, aggiunge allo stage l'.swf esterno a caricamento COMPLETATO senza tenere conto del suo stato di avanzamento e come è chiaramente scritto nella guida che hai linkato:
Il caricamento asincrono prevede che, una volta lanciato il processo di loading, il flusso del programma continui senza tener conto del suo avanzamento: solo quando il file è completamente caricato, il processo di loading lo segnala e il filmato può essere mandato in esecuzione.
Quello che vedi nella simulazione di download è il caricamento di tutto il filmato principale e nel fotogramma 2, dove è il pulsante "contatti" e il rispettivo Listener che ne avvia il caricamento e il Listener che aggiunge allo stage l'.swf a caricamento completato, non c'è nessun riferimento con l'animazione inserita nel fotogramma 1 (che poi animazione non è in quanto hai determinato semplici spostamenti sull'asse x al verificarsi di una determinata condizione)
Se vuoi visualizzare un'animazione di preload devi usare il ProgressEvent.PROGRESS e nella guida che hai linkato si parla anche di questo, bastava andare in pagina 2.
Nell'esempio ho un MovieClip in libreria esportato per AS a cui ho dato il nome classe: Preloader. E' costituito da un campo di testo dinamico di nome "testo" e un quadratino di nome "barra".
Codice PHP:
var loader:Loader = new Loader ;
var preloader:Preloader = new Preloader ;
contatti.addEventListener(MouseEvent.CLICK, carica);
function carica(evento:MouseEvent):void
{
loader.load(new URLRequest("01.jpg"));
loader.contentLoaderInfo.addEventListener(Event.OPEN, inizioCaricamento);
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, caricamentoInCorso);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, caricamentoCompletato);
}
function inizioCaricamento(evento:Event):void
{
preloader.x = 50;
preloader.y = 350;
addChild(preloader);
}
function caricamentoInCorso(evento:ProgressEvent):void
{
var percentuale:uint = evento.bytesLoaded / evento.bytesTotal * 100;
preloader.testo.text = "Caricamento " + percentuale + "%";
preloader.barra.width = percentuale;
}
function caricamentoCompletato(evento:Event):void
{
removeChild(preloader);
addChild(loader);
}
Questo è un esempio in cui ho utilizzato anche l' Event.OPEN per monitorare l'inizio della procedura di caricamento file. Un evento che in questo caso può essere superfluo in quanto l'istanza di tipo:Preloader (ovvero: preloader) è già istanziata e creata a livello globale, quindi visibile in tutto il codice e pertanto tutto quello che ho messo nella funzione "inizioCaricamento" si poteva mettere direttamente nella funzione "carica".
Anche l'addChild dell'oggetto Loader (loader) si potrebbe mettere nella funzione "carica" a condizione che quest'ultimo sia già stato istanziato e creato con il costruttore "new".
Di fatto il FlashPlayer memorizza l'addChild dell'oggetto ma ovviamente lo aggiungerà alla DisplayList solo quando quest'ultimo sarà completamente caricato.
Spero che questo esempio ti sia di aiuto per capire l'esatta logica degli eventi riservati alla classe "LoaderInfo" e il loro corretto utilizzo.
ciao