Effetti speciali e sviluppo giochi in Java(TM) -Miglioriamo il caricamento delle immagini con MediaTracker
di Anibal Wainstein (traduzione di Hanami Solutions)
4.0.2 Miglioriamo il caricamento delle immagini con MediaTracker
Avete notato che potete praticamente vedere l'immagine caricarsi
nell'esempio della scorsa sezione? Questo perché
il metodo paint() viene invocato varie volte durante il
download della immagine! La ragione per cui Sun ha scelto di fare
il sistema così, è che voleva mantenere l'effetto di vedere
qualcosa mentre si aspettava che una pagina venisse scaricata. Questo era
la norma nei vecchi browsers (quelli nuovi come IE4.0, mostrano
l'immagine quando è stata scaricata per intero, a meno che
non si tratti di una GIF interlacciata). Il metodo paint()
verrà invocato arbitrariamente dal browser quando
sia riuscito a scaricare una nuova parte dell' immagine. Questo potrebbe
causare problemi ed apparire brutto in alcune applets. Ma esiste una
soluzione, ovvero una classe chiamata MediaTracker, la quale garantisce
che l'immagine sia stata scaricata per intero prima che l'usiate.
Riscriviamo come segue il metodo init() method della scorsa sezione:
public void init()
{
logo=getImage(getDocumentBase(),"logo.jpg"); //La seguente linea crea un tracker.
MediaTracker tracker=new MediaTracker(this); //Diamo all'immagine che vogliamo tenere sott'occhio
// il numero identificativo 0.
tracker.addImage(logo,0); //Col metodo waitForAll() l'immagine può
//essere caricata. Genererà un InterrupterException
//se succede qualcosa. try
{
tracker.waitForAll();
} catch(InterruptedException e)
{ System.out.println("Qualcosa è successo durante la lettura dell'immagine...");
}
}
Un oggetto tracker richiede un riferimento alla applet quando
viene creato (lo ottieni con "this"). Col metodo
addImage() possiamo dare all'immagine il numero ID 0, nella
"lista di download" interna del metodo. Notate bene
che non potete dare a varie immagini lo stesso numero ID, ognuna
deve avere un numero unico. Finalmente, possiamo usare il metodo waitForAll()
che garantisce di poter caricare tutte le immagini. Questo metodo
genera una eccezione
che dovete "rilevare".
Clickate qua per assistere
ad una versione migliorata dell' applet della scorsa sezione. In questo esempio
la differenza è minima e forse nemmeno notabile, ma
in applets grafiche più complicate è una necessità.
Pagina seguente >>
|