4. Multimedialità in ambiente WWW


4.5 Animazione

Java rende possibile l'introduzione di animazioni nei documenti HTML. Prima che la Sun mettesse a disposizione del pubblico il linguaggio Java, l'unico modo possibile per generare animazioni in ambiente Web consisteva nello sfruttare, con qualche espediente, la Common Gateway Interface (CGI). Sinteticamente, si doveva scrivere per il server un programma CGI che, richiamato (indirettamente) dal client, inviasse le immagini sequenzialmente usando i MIME del protocollo HTTP. Gli svantaggi di questo metodo sono rilevanti. In primo luogo, la velocità dell'animazione dipende pesantemente dalla velocità del collegamento tra client e server, ovvero da un parametro incostante ed aleatorio. Questo fatto spesso rende accettabili le animazioni solamente quando sussiste una alta capacità della rete nella connessione end-to-end. In secondo luogo, le animazioni ripetive (cioè quelle che ripropongono periodicamente le stesse immagini) costringono il server a mantenere, per tutta la durata dell'animazione, una connessione attiva con il client. Ciò porta ad uno spreco eccessivo della capacità della rete. Infine, le animazioni non partono automaticamente quando il client Web carica la pagina HTML. Al contrario, l'utente deve provvedere esplicitamente ad avviare le animazioni una per volta.

Per tutti i motivi appena citati, le animazioni realizzate mediante interfaccia CGI si incontrano raramente in Internet e generalmente niente più sono che delle mere curiosità. Java, invece, permette di inserire animazioni nei documenti HTML senza svantaggi di rilievo. In effetti, Java è un linguaggio di programmazione completo per l'ambiente Web, e di conseguenza esso conferisce al programmatore la massima libertà per realizzare le animazioni nei documenti HTML. Queste ultime saranno generate tramite appositi programmi applet implementati in maniera da soddisfare alle esigenze e ai gusti dell'utente e del programmatore. Di conseguenza, non si possono dare metodi generali e particolareggiati per realizzare le animazioni tramite Java. La successione di immagini da visualizzare nella finestra del browser può essere reperita da un server generico predisposto allo scopo, oppure può essere generata dallo stesso applet che produce l'animazione. A tale scopo, si può pensare di usare, per esempio, algoritmi che generano figure frattali. Si può anche immaginare uno applet che genera una animazione interpolando alcune immagini caricate da un certo server. Come avviene per tutti i linguaggi di programmazione, il codice Java relativo ad applet atti a generare animazioni può assumere le forme più svariate.
Per queste ragioni, si fornirà un esempio significativo di applet che genera animazione tramite la descrizione di Animator, fornito con il JDK. Questo applet presenta doti di buona flessibilità per quanto riguarda le animazioni che può generare. Inoltre, esso, durante la sua esecuzione, ha anche la possibilità di generare un sonoro. Come è già stato detto nel paragrafo precedente "Inserimento di uno applet in un documento HTML", Animator accetta una serie di parametri dal documento HTML che lo contiene. Essi sono:

Come si può notare, i file che contengono il sonoro e le immagini sono reperiti attraverso URL e quindi essi possono provenire da qualsiasi sito di Internet. Inoltre, alterando semplicemente il documento HTML, si ha la possibilità di cambiare animazione e sonoro.

Animator provvede a caricare le immagini e i file audio come specificato dai parametri che vengono passati ad esso dal documento HTML. Dopo di ciò, lo applet provvede a mostare le immagini sequenzialmente nella finestra del browser. La posizione delle immagini, le pause e gli altri attributi dell'animazione vengono stabiliti con i relativi parametri. Al contempo, Animator provvede pure a far eseguire dal browser i file audio.
Lo schema seguente illustra il funzionamento dello applet Animator ed è pure esemplificativo del funzionamento di un generico applet.

Come si nota nello schema di sopra, lo applet si interfaccia al browser per la gestione dei flussi dei dati di ingresso e uscita. Il browser provvede alla scompattazione dei file compressi nei vari formati, alla gestione delle periferiche per l'esecuzione del sonoro, etc. Ciò semplifica notevolmente il codice Java che costituisce lo applet e provvede pure a fornire una buona garanzia di sicurezza. Sarebbe molto rischioso se gli applet potessero accedere direttamente alle periferiche della macchina del client. Bisogna ricordare infatti che gli applet vengono mandati in esecuzione automaticamente con il caricamento di pagine HTML provenienti da tutto il mondo, senza alcun controllo preventivo. La tentazione di scrivere applet dannosi per il client sarebbe forte se questi ultimi potessero gestire direttamente le periferiche.

Per quanto si è detto, uno applet può generare una animazione provvedendo a mostrare, una dopo l'altra, alcune immagini caricate precedentemente tramite opportune URL. Il codice Java necessario per compiere queste operazioni fa uso dei metodi contenuti nelle classi di libreria. In particolare, le classi di libreria peculiari per implementare applicazioni del genere appena descritto sono:

Come esempio significativo, si può illustrare come mostrare una immagine caricata tramite URL. Il codice seguente ha senso solo se implementato in uno applet, cioè in una sottoclasse di java.applet.Applet. Infatti, per effettuare le URL è necessario che l'applicazione operi nell'ambiente di un browser Web. Conseguentemente, l'applicazione stessa deve essere uno applet. Per prima cosa, si definiscono le variabili necessarie allo scopo:

Image  img_1;
URL  img_1_URL;
coord_x = 100;
coord_y = 50;

Poi si crea la URL tramite un costruttore di essa fornito nella classe di libreria java.net.URL:

img_1_URL = new URL("http://labcad1.ing.unifi.it/images/immagine_1.gif");

Quindi si ottiene l'immagine con il metodo getImage (classe Applet):

img_1 = getImage(img_1_URL);

Infine si disegna l'immagine ottenuta sovrascrivendo (override) il metodo astratto public void paint(Graphics g) della classe superiore (superclass) astratta java.awt.Component:

public void paint(Graphics disegna) {

	/* Si invoca il metodo drawImage di java.awt.Graphics che permette di visualizzare una 
	immagine alle coordinate volute */

	disegna.drawImage(img_1, coord_x, coord_y, this);
}

Per generare una animazione sarà sufficiente visualizzare una alla volta più immagini ottenute nella maniera appena descritta. A tale scopo si può usare, per esempio, anche un normale ciclo for.