| Artículos | 01 FEB 1999

Imágenes, animación y sonido

Tags: Histórico
Curso de Java para Internet (y 8)
Jaime Peña.

Imágenes, animaciones y sonido son elementos muy importantes, tanto para hacer más atractivos nuestros applets, como para acompañarlos de una mayor interactividad . A su vez, son el soporte de opciones avanzadas, como simulaciones y asistentes .

En este artículo, hablaremos de cómo incluir imágenes ( en formatos soportados en la web, típicamente GIF y JPEG ) en nuestros applets o aplicaciones gráficas AWT . Las animaciones, al contrario de los GIF animados de las páginas HTML, se generan mostrando imágenes independientes en forma secuencial y, en su caso, recursiva . Los sonidos, que deben encontrarse en formato AU de Sun Microsystems, también pueden ejecutarse una única vez o cíclicamente, pararse y activarse a voluntad .

Aquí hablaremos de cómo exponer todos estos tipos básicos del mundo multimedia . La interactividad con ellos se logrará combinándolos con botones de comando y otros controles AWT . De eso nos hemos ocupado con anterioridad y a ello nos remitimos .

Carga de imágenes desde archivos

La presentación de imágenes desde un applet o una aplicación gráfica independiente basada en la biblioteca AWT, no se realiza mediante funciones de acceso a archivo tradicionales . La biblioteca AWT dispone de un método especial para ello que tiene el formato:

public Image getImage ( URL url )

public Image getImage ( URL url, String name )

Por ejemplo:

unaImagen = getImage ( getDocumentBase ( ) , ?imagen . jpg? ) ;

Nos cargaría una imagen JPEG ( de extensión . JPG ) , que se encuentra alojada en la dirección de Internet ( o de una intranet u ordenador local ) que se especifica en el primero de los parámetros, en nuestro ejemplo, se indica getDocumentBase ( ) , lo que significa que es la misma dirección en que se encuentra el archivo de la página HTML . Si deseamos referenciar el directorio en que se aloja el archivo de código . class, deberemos utilizar, en su vez, el método getCodeBase ( ) .

Otros ejemplos de uso podrían ser:

unaImagen = getImage ( new URL ( ?http://www . servidor . com/directorio? ) , ?imagen . jpg? ) ;

unaImagen = getImage ( new URL ( ?http://www . servidor . com/directorio/imagen . jpg? ) ) ;

Que tomarían una imagen ( imagen . jpg ) dentro del directorio de la dirección URL indicada . Si bien podremos usar este código en cualquier lugar, lo normal es que se encuentre dentro del método init ( ) . Para mostrar, más adelante, la ( s ) imagen ( es ) cargada ( s ) , hemos de codificar algo similar a:

public void paint ( Graphics g ) {

?

g . drawImage ( unaImagen, 20, 20, this ) ;

?

}

Se trata, por tanto, de utilizar el método drawImage ( ) en el método paint ( ) del applet ( o de la aplicación AWT independiente ) . Este método toma como primer parámetro la referencia a la imagen obtenida, bien desde un archivo, bien desde una dirección URL, o bien dibujada en memoria; recuerde lo visto en nuestra anterior artículo, acerca de la técnica del doble buffer . Los siguientes parámetros indican las cotas X e Y, del borde superior izquierdo de la ventana, en las que se situará la imagen; por último, el tercer parámetro se refiere a al observador . Hemos de pasar como referencia this .

Cabe, también, utilizar otros formatos para el método drawImage ( ) , por ejemplo al estilo:

public void paint ( Graphics g ) {

?

g . drawImage ( unaImagen, 10, 15, 200, 100, this ) ;

?

}

Aquí, como tercer y cuarto parámetros se indica, respectivamente, el ancho y el alto asignado a la imagen . Si el tamaño real es diferente, se realizará un escalado automático para hacer caber la imagen en el área rectangular asignada . En el Listado 37 se codifica un ejemplo, modesto pero ilustrativo, en el que se carga una imagen GIF y se expone en su tamaño natural y reducida en un 50% en su alto y en su ancho .

Secuencias de imágenes . Animación

Las animaciones son una parte muy importante de lo que Java puede mejorar el aspecto de sus páginas web . El término animación implica varias posibilidades: mover una misma imagen en el área del applet; mostrar imágenes sucesivas, en un mismo lugar, que den el aspecto de animación, o mostrar imágenes sucesivas en diversos lugares de la ventana, que suponen una animación más dinámica, en movimiento ( típico es un cohete desplazándose, o el muy común ejemplo de un dibujo animado ejecutando diversas acciones ) .

Las animaciones, sea cual sea su tipo, presentan algunas peculiaridades que conviene aclarar . Primero, una animación conlleva una secuenciación, por lo que hemos de codificar temporalizaciones . En segundo lugar, pero no menos importante, el código para la animación puede hacerse con el control absoluto del applet, lo que impediría realizar otras operaciones . Por ello, hemos de acudir a los denominados Threads ( hilos de ejecución ) , que permiten utilizar convenientemente los tiempos muertos entre las diversas presentaciones, de manera que se pueda trabajar paralelamente con otro código del applet .

En esencia, una animación que presente una secuencia de imágenes, contendrá una maqueta de código similar a:

public class Animacion extends java . applet . Applet

implements Runnable {

Image imagenes [ ] = ?;

Thread hilo;

int numeroImagen;

public void init ( ) { ? }

public void start ( ) {? }

public void stop ( ) {? }

public void run ( ) {? }

public void paint ( Graphics g ) { ? }

public void update ( Graphics g ) {

paint ( g ) ;

}

}

Yéndonos a lo más significativo ( véase, por ejemplo, el Listado 38 ) , deberemos declarar la clase base del applet como Runnable . Eso se refiere a que utilizaremos Threads para controlar actividades diversas, que se ejecutarán compartiendo tiempos . Habitualmente, deberemos crear una matriz de imágenes, que se cargarán, como se indicó más arriba, en el método init ( ) . Posteriormente nos encontramos con tres nuevos métodos: start ( ) , stop ( ) y run ( ) ; aquí se encuentra la verdadera esencia del hilo de ejecución . Veamos detalladamente el Listado 38; en el método start ( ) se crea el Thread y se inicia su ejecución, mediante hilo . start ( ) . Inmediatamente, se llamará ( lo hace la aplicación de forma automática ) al método run ( ) , encargado de fijar el código a ejecutar; observe que deberemos indicar qué y cuántas veces se realizarán operaciones, por eso se crea un bucle infinito while ( true ) {?}, en cuyo interior se recrea la animación ( en este ejemplo, una secuencia de imágenes, 4, que se muestran de forma cíclica ) . Para indicar retardos en la animación, deberemos utilizar el método sleep ( milisegundos ) , capturando las posibles excepciones en tiempo de ejecución:

try{// 250 milisegundos

Thread . sleep ( 250 ) ;

}

catch ( InterruptedException e ) {};

Por último, hemos de liberar el hilo de ejecución cuando ya no se desee continuar con la animación ( en nuestro ejemplo, se llama automáticamente al destruir el applet ) . Eso exactamente es lo que se debe indicar en el método stop ( ) :

public void stop ( ) {

if ( animar ! = null ) {

animar . stop ( ) ;

animar = null;

}

}

Otra posibilidad, muy atractiva desde el punto de la rapidez de carga de las páginas web, es utilizar un GI

Contenidos recomendados...

Comentar
Para comentar, es necesario iniciar sesión
Se muestran 0 comentarios
X

Uso de cookies

Esta web utiliza cookies técnicas, de personalización y análisis, propias y de terceros, para facilitarle la navegación de forma anónima y analizar estadísticas del uso de la web. Consideramos que si continúa navegando, acepta su uso. Obtener más información