Specialeffekter och spelutveckling
i Java(TM) - Snygga upp inladdning av bilder med MediaTracker
av Anibal Wainstein
4.0.2 Snygga upp inladdning
av bilder med MediaTracker
Märkte du att du praktiskt taget kunde se bilden laddas
in i förra avsnittets exempel? Detta beror på att
paint() metoden anropas flera gånger medan bilden
laddas ner! Anledningen till att Sun valde att göra
så här är att de vill bevara effekten att
kunna se någonting när man väntar på
nedladdning av en hemsida. Detta var vanligt i äldre
webbtittare (nya webbtittare som IE4.0 visar bara bilden när
den är fullt nedladdad, om det nu inte råkar vara
en specialkonfigurerad GIF bild). Paint() metoden kommer att
anropas av webbtittaren godtyckligt när den har lyckats
ladda ner en ny bit av bilden. Detta kan dock ställa
till problem eller vara estetiskt oacceptabelt i vissa applets.
Men det finns en lösning, det finns en klass som heter
MediaTracker (Mediaspåraren), den här klassen ser
till att en bild (eller ljudfil) är fullt nedladdad innan
den används.
Vi skriver om init() metoden i förra avsnittet till följande:
public void init()
{
logo=getImage(getDocumentBase(),"logo.jpg");
//Följande rad skapar en spårare
MediaTracker tracker=new MediaTracker(this);
//Vi ger bilden vi vill spåra identitetsnumret 0
tracker.addImage(logo,0);
//Med metoden waitForAll() kan bilden laddas in
//Den kastar en InterruptedException om
//någonting händer
try
{
tracker.waitForAll();
}
catch(InterruptedException e)
{
System.out.println("Någonting stoppade inladdningen...");
}
}
Ett trackerobjekt kräver en pekare till Java appleten
när den skapas (det får man med "this").
Med metoden addImage() så kan vi ge bilden identitetsnumret
0 i metodens interna "inladdningslista". Observera
att du inte kan ge flera bilder samma identitetsnummer utan
varje bild måste ha sitt eget. Till sist kan man använda
metoden waitForAll() för att se till att alla bilder
laddas in. Denna metod kastar ut en exception
som du måste"fånga".
Klicka här för
att se en förbättrad version av förra avsnittets
applet. I det här exemplet är skillnaden minimal
och kanske inte ens märkbar, men i mer komplicerade grafikapplets
så är det en nödvändighet.
Nästa sida >>
|
 |  |
|