AS2 Utilizzo di MovieClipLoader
Introduzione all'utilizzo della classe
Inserito il 01-03-2007
Preludio
Non è mai facile abituarsi alle novità, nè nella vita di tutti i giorni, nè quando si ha a che fare con programmi e relativi
linguaggi, che cambiano e implementano nuove risorse e nuove funzionalità, come fa spesso il nostro caro Adobe (formerly
Macromedia) Flash.
Così ho pensato in questo articolo, a due anni di distanza dalla comparsa di questa "novità", di approfondire o quanto
meno iniziare il lettore, all'utilizzo della classe MovieClipLoader.
Che cos'è?
In generale: la classe MovieClipLoader è un oggetto di programmazione come qualsiasi altro esistente in Flash (MovieClip, Button, TextField, Date ecc...) e come tale possiede proprietà e metodi (azioni) utilizzabili per portare a termine gli scopi di tale classe.
In sostanza: la classe MovieClipLoader si occupa di eseguire tutte quelle operazioni di calcolo che fino a Flash 6 eravamo costretti a farci a mano, utilizzando i classici preload, spesso imprecisi e quasi sempre inutili per le funzioni da compiere nel momento in cui il file esterno risultava caricato, ad esempio se utilizzate il seguente script per caricare un'immagine e poi ridimensionarla, nella maggior parte dei casi non riuscirete a farlo:
function preload (target) {
var car = target.getBytesLoaded();
var tot = target.getBytesTotal();
if(car == tot){
target._width = 300;
target._height = 300;
clearInterval(a);
}
}
mio_mc.loadMovie("img.jpg");
a = setInterval(preload, 100, mio_mc);questo perchè effettivamente c'è uno stacco tra il momento in cui l'immagine è stata caricata in flash e il momento in cui
quest'immagine è realmente fruibile a livello di codice. Con un normale preload questo lasso di tempo non è calcolato, mentre la classe
MovieClipLoader mette a disposizione dei metodi (eventi) separati che vengono eseguiti durante il caricamento secondo il momento, li vedremo in
particolare uno per uno nella prosecuzione della lettura.
Inoltre, la classe è utile in quei casi in cui si deve verificare che un caricamento sia possibile, se ad esempio un file non esiste il caricamento
non avverrà, mentre con i vecchi preload non era possibile verificare tale situazione di errore, con la classe MovieClipLoader è possibile, ancora
grazie ad uno dei metodi dedicati.
Quando si usa
Ne consiglio l'utilizzo in tutti quei casi in cui sia necessario, a fine preload, eseguire altre operazioni strettamente legate al caricamento stesso del file esterno e nei casi in cui non si sia certi che l'immagine esista, in modo da poterne verificare l'errore di caricamento. In generale è possibile utilizzare la classe ogni qualvolta sia necessario effettuare un caricamento esterno, anche come abitudine generale di comportamento per evitare spiacevoli sorprese legate ai caricamenti esterni.
Come si usa
L'utilizzo della classe potrebbe essere difficoltoso inizialmente, per chi non ha mai utilizzato i "listener" di cui parleremo più
avanti, ma una volta entrati nel meccanismo sarà facilissimo utilizzarla al meglio. Per prima cosa è necessario creare una istanza della classe
in questo modo
var mcLoad:MovieClipLoader = new MovieClipLoader();
semplice no?! A questo punto, senza spaventarci
troppo, vediamo il primo e, credo, più importante cambiamento a livello di codice per il caricamento: con la classe MovieClipLoader il vecchio
loadMovie non deve essere più utilizzato, al suo posto c'è un metodo dedicato della classe, il metodo loadClip, riprendiamo il codice precedente e
vediamo come funziona:
var mcLoad:MovieClipLoader = new MovieClipLoader();
mcLoad.loadClip("file_esterno.jpg", clip);
// due parametri,
// il primo è una stringa che sarà il nome+estensione del file esterno da caricare
// il secondo è il nome del MovieClip su cui caricare il file esterno
E questo è il minimo che si fa quando si vuole caricare un file esterno con la classe MovieClipLoader. Naturalmente la classe servirebbe a poco se si limitasse a questo, ecco quindi che per utilizzare al meglio la nostra classe dobbiamo utilizzare anche i gestori di eventi associati, che come già detto sopra, servono a gestire le azioni in determinati momenti/periodi del caricamento, le elenchiamo con la relativa spiegazione:
- onLoadStart -> richiamato al momento preciso in cui inizia il caricamento.
Questo gestore di eventi può essere generalmente utilizzato come contenitore di tutte quelle azioni legate all'inizio del caricamento, ad esempio in caso si voglia abbassare l'alpha del clip prima di effettuare il caricamento, o si voglia attaccare nello stage una barra che mostri la percentuale caricata ecc... ad esempio:
var mcList:Object = new Object();
mcList.onLoadStart = function(target){
// porto il clip che carica ad alpha 0
target._alpha = 0;
// attacco dalla libreria una barra, a coordinate 100,100 e gli minimizzo la scalaX
_level0.attachMovie("preloader", "preloader", _level0.getNextHighestDepth(), {_x:100, _y:100, _xscale:0});
}- onLoadProgress -> richiamato più volte durante tutto il caricamento E' questo il gestore che si occupa di monitorare il caricamento, quindi grazie a lui è possibile effettuare quelle azioni che normalmente affidavamo ad un enterFrame o ad un setInterval. E' qui che inserirò i calcoli per modificare la scalaX della mia barra per dare la parvenza del caricamento e qui volendo inserirò anche la "modifica" di un testo che legge la percentuale caricata ecc... esempio:
mcList.onLoadProgress = function(target, bytesLoaded, bytesTotal){
// notare i tre parametri passati, tutti riconosciuti dall'onLoadProgress per monitorare il caricamento
//
// ottengo la percentuale con la solita proporzione
var percentuale:Number = Math.floor((bytesLoaded/bytesTotal)*100);
// ne assegno il valore alla scalaX della barra attaccata in precedenza
_level0['preloader']._xscale = percentuale;
}- onLoadComplete -> richiamato nel momento in cui il caricamento finisce Si può considerare o meno, diciamo che potrebbe essere la contrapposizione di onLoadStart, quindi si possono fare azioni tipo quella di eliminare il clip "preloader" dallo stage e riportare l'alpha del target a 100, esempio:
mcList.onLoadComplete = function(target){
_level0['preloader'].removeMovieClip();
target._alpha = 100;
}- onLoadInit -> richiamato nel momento in cui il file esterno diventa realmente fruibile all'interno del filmato Ed eccoci alla novità, più importante, insieme al prossimo ed ultimo metodo. In pratica questo evento indica il momento esatto in cui le proprietà, gli eventi e funzioni del target sono "nuovamente" fruibili, ed è possibile ad esempio calcolare la posizione del clip in base alle proprie dimensioni, ridimensionarlo o assegnargli un'azione come pulsante, ad esempio:
mcList.onLoadInit = function(target) {
target._x = target._width+100;
target.onRelease = function(){
trace(this._name);
trace(this._x);
trace(this._y);
}
}- onLoadError -> richiamato in caso di un qualsiasi intoppo nelle azioni di caricamento Ultimo metodo, non meno importante. Magari meno utilizzato in quei casi in cui non si abbiano dubbi sul fatto che avverrà il caricamento della fonte esterna, ma sempre meglio da considerare, un esempio di utilizzo è rappresentato da un altro articolo presente nel database -> http://www.v2online.it/articoli/slideshow.html
Finita la carrellata sui metodi ed il loro significato, passiamo a vedere come questi debbano essere effettivamente utilizzati. Per utilizzare i metodi su descritti abbiamo bisogno di affidarne l'inizializzazione ad un oggetto creato apposta per lo scopo, che verrà poi collegato al nostro MovieClipLoader attraverso il metodo addListener, in questo modo
var mcLoad:MovieClipLoader = new MovieClipLoader();
var mcList:Object = new Object();
mcList.onLoadInit = function(){
trace("Inizializzato");
}
mcLoad.addListener(mcList);
mcLoad.loadClip("file_esterno.jpg", clip);Conclusioni
Direi che per il momento possiamo fermarci qui, inserirò a breve un esempio completo da scaricare, in modo da avere un quadro completo sul modo di eseguire i caricamenti esterni, utilizzando la classe MovieClipLoader al posto dei vecchi metodi.
Update 22-06-2007
Come annunciato, metto a disposizione un esempio completo di utilizzo della classe, scaricabile all'indirizzo ../classes/moviecliploader.zip
