Gráficos avanzados
Interfaz gráfica de bajo nivel
Gráficos en LCDUI
Creación de un Canvas
Propiedades del Canvas
Mostrar el Canvas
Contexto gráfico
Atributos
Dibujar primitivas geométricas
Puntos anchor
Cadenas de texto
Imágenes
Animación
Redibujado del área
Técnica del doble buffer
Código para la animación
Hilo de eventos
Optimización de imágenes
Eventos de entrada
Códigos del teclado
Acciones de juegos
Punteros
APIs propietarias
Gráficos
Sonido
Control del dispositivo
Detección de la API propietaria
Gráficos 3D
Renderización 3D
Transformaciones geométricas
Cámara
Luces
Fondo
Modo inmediato
Modo retained
Interfaz gráfica de bajo nivel
Hasta ahora hemos visto la creación de aplicaciones con una interfaz gráfica creada a partir de una serie de componentes de alto nivel definidos en la API LCDUI (alertas, campos de texto, listas, formularios).
En este punto veremos como dibujar nuestros propios gráficos directamente en pantalla. Para ello Java nos proporciona acceso a bajo nivel al contexto gráfico del área donde vayamos a dibujar, permitiéndonos a través de éste modificar los pixels de este área, dibujar una serie de figuras geométricas, así como volcar imágenes en ella.
También podremos acceder a la entrada del usuario a bajo nivel, conociendo en todo momento cuándo el usuario pulsa o suelta cualquier tecla del móvil.
Este acceso a bajo nivel será necesario en aplicaciones como juegos, donde debemos tener un control absoluto sobre la entrada y sobre lo que dibujamos en pantalla en cada momento. El tener este mayor control tiene el inconveniente de que las aplicaciones serán menos portables, ya que dibujaremos los gráficos pensando en una determinada resolución de pantalla y un determinado tipo de teclado, pero cuando la queramos llevar a otro dispositivo en el que estos componentes sean distintos deberemos hacer cambios en el código.
Por esta razón para las aplicaciones que utilizan esta API a bajo nivel, como los juegos Java para móviles, encontramos distintas versiones para cada modelo de dispositivo. Dada la heterogeneidad de estos dispositivos, resulta más sencillo rehacer la aplicación para cada modelo distinto que realizar una aplicación adaptable a las características de cada modelo.
Al programar las aplicaciones deberemos facilitar en la medida de lo posible futuros cambios para adaptarla a otros modelos, permitiendo reutilizar la máxima cantidad de código posible.
Gráficos en LCDUI
La API de gráficos a bajo nivel de LCDUI es muy parecida a la existente en AWT, por lo que el aprendizaje de esta API para programadores que conozcan la de AWT va a ser casi inmediato.
Las clases que implementan la API de bajo nivel en LCDUI son Canvas y Graphics. Estas clases reciben el mismo nombre que las de AWT, y se utilizan de una forma muy parecida. Tienen alguna diferencia en cuanto a su interfaz para adaptarse a las necesidades de los dispositivos móviles.
El Canvas es un tipo de elemento displayable correspondiente a una pantalla vacía en la que nosotros podremos dibujar a bajo nivel el contenido que queramos. Además este componente nos permitirá leer los eventos de entrada del usuario a bajo nivel.
Esta pantalla del móvil tiene un contexto gráfico asociado que nosotros podremos utilizar para dibujar en ella. Este objeto encapsula el raster de pantalla (la matriz de pixels de los que se compone la pantalla) y además tiene una serie de atributos con los que podremos modificar la forma en la que se dibuja en este raster. Este contexto gráfico se definirá en un objeto de la clase Graphics. Este objeto nos ofrece una serie de métodos que nos permiten dibujar distintos elementos en pantalla. Más adelante veremos con detalle los métodos más importantes.
Este objeto Graphics para dibujar en la pantalla del dispositivo nos lo deberá proporcionar el sistema en el momento en que se vaya a dibujar, no podremos obtenerlo nosotros por nuestra cuenta de ninguna otra forma. Esto es lo que se conoce como render pasivo, definimos la forma en la que se dibuja pero es el sistema el que decidirá cuándo hacerlo.
Creación de un Canvas
Para definir la forma en la que se va a dibujar nuestro componente deberemos extender la clase Canvas redefiniendo su método paint. Dentro de este método es donde definiremos cómo se realiza el dibujado de la pantalla. Esto lo haremos de la siguiente forma:
public class MiCanvas extends Canvas {
public void paint(Graphics g) {
// Dibujamos en la pantalla
// usando el objeto g proporcionado
}
}
Con esto en la clase MiCanvas hemos creado una pantalla en la que nosotros controlamos lo que se dibuja. Este método paint nunca debemos invocarlo nosotros, será el sistema el que se encargue de invocarlo cuando necesite dibujar el contenido de la pantalla. En ese momento se proporcionará como parámetro el objeto correspondiente al contexto gráfico de la pantalla del dispositivo, que podremos utilizar para dibujar en ella. Dentro de este método es donde definiremos cómo dibujar en la pantalla, utilizando para ello el objeto de contexto gráfico Graphics.
Siempre deberemos dibujar utilizando el objeto Graphics dentro del método paint. Guardarnos este objeto y utilizarlo después de haberse terminado de ejecutar paint puede producir un comportamiento indeterminado, y por lo tanto no debe hacerse nunca.
Propiedades del Canvas
Las pantallas de los dispositivos pueden tener distintas resoluciones. Además normalmente el área donde podemos dibujar no ocupa toda la pantalla, ya que el móvil utiliza una franja superior para mostrar información como la cobertura o el título de la aplicación, y en la franja inferior para mostrar los comandos disponibles.
Sin embargo, a partir de MIDP 2.0 aparece la posibilidad de utilizar modo a pantalla completa, de forma que controlaremos el contenido de toda la pantalla. Para activar el modo a pantalla completa utilizaremos el siguiente método:
setFullScreenMode(true); // Solo disponible a partir de MIDP 2.0
Es probable que nos interese conocer desde dentro de nuestra aplicación el tamaño real del área del Canvas en la que podemos dibujar. Para ello tenemos los métodos getWidth y getHeight de la clase Canvas, que nos devolverán el ancho y el alto del área de dibujo respectivamente.
Para obtener información sobre el número de colores soportados deberemos utilizar la clase Display tal como vimos anteriormente, ya que el número de colores es propio de todo el visor y no sólo del área de dibujo.
http://www.jtech.ua.es/apuntes/ajdm2010/sesiones/sesion04-apuntes.html
No hay comentarios:
Publicar un comentario