Thursday, June 20, 2013
EL RETORNO DE LA ETERNIDAD
En el ultimo capitulo veíamos como crear aplicaciones para dispositivos moviles utilizando las bondades del lenguaje Java, y mas específicamente. el J2ME.... pues el Mundo ha dado algunas vueltas desde entonces; empezando por el hecho que Java con todas sus modalidades y presentaciones ha pasado a formar parte de la familia Oracle.
Y aunque esto ha representado, en mi humilde opinión, un retraso en la evolución del Java; también han surgido nuevos paradigmas y necesidades, así como herramientas y opciones dentro del desarrollo de aplicaciones movibles.
Ahora el Mundo gira interconectado los unos con los otros, de alli que ahora las aplicaciones móviles deben planear dentro de la Nube; interactuando con redes sociales, webservices, accesos remotos a la información relevante y claro, por supuesto, a una total independencia entre dispositivo y aplicación. Esto es, que el desarrollo de la aplicacion depende aun menos del dispositivo en el que se va a ejecutar.
Por esto ahora que hemos regresado a seguir colaborando en este blog, nos pondremos al dia para seguir con nuestro trabajo de desarrollo.
Thursday, November 27, 2008
BAJEMOS A ECHAR UN VISTAZO
INTERFACES DE BAJO NIVEL
Bueno, en las entregas anteriores hablamos de las interfaces de alto nivel; comentábamos que estas interfaces son de las más fáciles de implementar pues su presentación gráfica queda a cargo del dispositivo en que se ejecute la aplicación.
Esto nos permite ahorrar tiempo y esfuerzo, aunque en ocasiones será necesario tomar el control de la presentación, por ejemplo: Si lo que estamos desarrollando es un videojuego.
REGLA No. 1:
Antes de comenzar, es conveniente que establecer una regla : "Todas las pantallas que vayamos a crear usando las APIs de bajo nivel heredan de la clase Canvas".
Por esta razón, lo primero de todo es conocer a fondo esta clase y luego iremos profundizando en cada uno de los elementos que la componen.
La clase Canvas es la superclase de todas las pantallas que usan las APIs de bajo nivel, al igual que Screen lo era para las pantallas que usaban las APIs de alto nivel.
CONVIVENCIA PACIFICA:
Sin embargo, en la relación de APIs de alto y bajo nivel, no hay nada escrito, ésto es : "No existe ningún impedimento que nos permita usar en el mismo MIDlet pantallas tanto derivadas de Canvas como de Screen"
La clase Canvas permite manejar eventos de bajo nivel y dibujar cualquier cosa por pantalla. Es por ésa razón que se usa como base para la realización de juegos.
Esta clase posee un método abstracto paint() que debemos implementar de manera obligatoria (Por nuestra propia voluntad) y es la encargada de dibujar en la pantalla del dispositivo.
import javax.microedition.lcdui.*;
public class BajoNivel extends Canvas implements CommandListener {
private PBajoNivel midlet;
private Command salir;
private Image imgFondo, imgTriste;
public BajoNivel(PBajoNivel mid) {
try {
imgFondo = Image.createImage("/fondo.PNG");
imgTriste = Image.createImage("/triste.PNG");
} catch (IOException e) {
e.printStackTrace();
}
salir = new Command("Salir", Command.EXIT,1);
this.midlet = mid;
this.addCommand(salir);
this.setCommandListener(this);
}
public void paint(Graphics g) {
g.setColor(255,255,255);
g.fillRect(0,0,getWidth(),getHeight());
g.setColor(0,0,0);
g.drawImage(imgFondo, 0, 0, 0);
g.drawImage(imgTriste, 40, 40, 0);
}
public void commandAction(Command c, Displayable d){
if (c == salir){
midlet.salir();
}
}
}
import javax.microedition.lcdui.*;
public class PBajoNivel extends MIDlet {
private BajoNivel panCanvas;
private Display pantalla;
public PBajoNivel() throws Exception{
pantalla = Display.getDisplay(this);
panCanvas = new BajoNivel(this);
}
public void startApp() {
pantalla.setCurrent(panCanvas);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
public void salir(){
destroyApp(false);
notifyDestroyed();
}
}
Sunday, November 23, 2008
EL RESTO DE LAS INTERFACES
private Display display;
private List miLista;
...
display = Display.getDisplay(this);
miLista = new List("Opciones", List.IMPLICIT);
miLista.append("Altas", null);
miLista.append("Bajas", null);
miLista.append("Consultas", null);
miLista.append("Modificaciones", null);
miLista.append("Impresion", null);
...
display.setCurrent(miLista);
Mientras que un objeto CHOICEGROUP debe estar unido a un objeto FORM.
private Display miDisplay;
private Form miForma;
private ChoiceGroup miGrupo;
...
miDisplay = Display.getDisplay(this);
miForma = new Form("MENU PRINCIPAL");
...
miGrupo = new ChoiceGroup("Opciones: ", ChoiceGroup.EXCLUSIVE);
miGrupo.append("Altas", null);
miGrupo.append("Bajas", null);
miGrupo.append("Consultas", null);
miGrupo.append("Modificaciones", null);
miGrupo.append("Impresion", null);
...
miForma.append(miGrupo);
...
display.setCurrent(miLista);
Pero además de estas clases contamos con muchas otras más como...
Class Ticker
Util para mostrar mensajes en forma de una marquesina deslizándote lado a lado de la pantalla del usuario.
Class DateField
Util para manejar fechas, ya sea para despliegue o para solicitar al usuario que proporcione una fecha en específico.
Class ImageItem
Util para trabajar con archivos de imágenes en nuestra aplicación. Ya lo veremos más adelante pero con esta herramienta podremos agregarle un atractivo visual que lo haga más amigable y agradable para el usuario.
Class TextField
Util para manejar texto; que puede ser de despliegue solamente o bien, para pedir al usuario que teclee datos. Como pueden password, números, nombres, etc.
Hay que recordar que las clases gráficas de alto nivel, tienen la facilidad de que se adaptan al tipo de despliegue con que cuenta el dispositivo en el cual estamos trabajando.
En otras palabras, nosotros llamamos las clases y creamos los objetos en nuestra aplicación, pero la presentación visual queda bajo el control del hardware.
Veamos ahora, el uso de las clases que acabamos de mencionar, en un ejemplo.
import java.io.IOException;
import java.util.Date;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.DateField;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.ImageItem;
import javax.microedition.lcdui.Item;
import javax.microedition.lcdui.ItemStateListener;
import javax.microedition.lcdui.TextField;
import javax.microedition.lcdui.Ticker;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class MIDOtros extends MIDlet implements CommandListener, ItemStateListener {
private Ticker miMarquesina;
private DateField miFecha;
private ImageItem miImagen;
private TextField miHumor;
private Image imgSerio, imgFeliz, imgTriste;
private Command Salir;
private Display miDisplay;
private Form miForma;
public MIDOtros() {
try {
imgSerio = Image.createImage("/serio.PNG");
imgFeliz = Image.createImage("/feliz.PNG");
imgTriste = Image.createImage("/triste.PNG");
} catch (IOException e) {
e.printStackTrace();
}
Date wHoy = new Date();
miDisplay = Display.getDisplay(this);
miFecha = new DateField("Dia de hoy",DateField.DATE);
miFecha.setDate(wHoy);
miHumor = new TextField("% de Animo", "50", 2, TextField.NUMERIC);
miMarquesina = new Ticker("Ejemplo de Graficos de Alto Nivel. Tutorial para el Desarrollo de aplicaciones en móviles, País México. Noviembre del 2008");
miForma = new Form("Otros Items");
Salir = new Command("Salir", Command.EXIT, 0);
miImagen = new ImageItem(null, imgSerio, 0, null);
miForma.setTicker(miMarquesina);
miForma.append(miFecha);
miForma.append(miImagen);
miForma.append(miHumor);
miForma.addCommand(Salir);
miForma.setCommandListener(this);
miForma.setItemStateListener(this);
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
}
protected void pauseApp() {
}
protected void startApp() throws MIDletStateChangeException {
this.miDisplay.setCurrent(this.miForma);
}
public void commandAction(Command arg0, Displayable arg1) {
if (arg0 == Salir){
try {
destroyApp(false);
} catch (MIDletStateChangeException e) {
e.printStackTrace();
}
notifyDestroyed();
}
}
public void itemStateChanged(Item arg0) {
if (arg0 == miHumor){
int wValor = Integer.parseInt(miHumor.getString());
if (wValor <> 70) {
miImagen.setImage(imgFeliz);
} else {
miImagen.setImage(imgSerio);
}
}
}
}
}
Como se observa, en esta aplicación manejamos archivos de imagen :
imgSerio = Image.createImage("/serio.PNG");
imgFeliz = Image.createImage("/feliz.PNG");
imgTriste = Image.createImage("/triste.PNG");
Que son archivos tipo PNG, este tipo nos permite manejar imágenes con una buena y razonable resolución y almacenarlos en poco espacio.
Bien, una vez compilado nuestro código; podemos ejecutarlo y verlo en acción.
Wednesday, November 5, 2008
CREACION Y ADMINISTRACION DE PROYECTOS
PONIENDO A TRABAJAR EL WIRELESS TOOLKIT
Todo proyecto comienza con un paso, y éste sería darle un click al ícono del Wireless Toolkit que se mira en la imagen.
Cuando se crea un proyecto, el Wireless Toolkit se encarga de crear un árbol de directorios en los que podremos almacenar nuestro código, los recursos que necesitemos en la aplicación y los archivos de instalación, entre otros.
Ya sea con la opción File-> New Project, o con el icono de New Project que aparece en pantalla; se puede crear un proyecto.
Para la creación del nuevo proyecto, deberemos proporcionar dos cosas:
- Nombre del Proyecto
- Nombre de la clase MIDlet
Por ejemplo, podemos dar como nombre del proyecto: Mi Primera Aplicación para J2ME, y como nombre de la clase MIDlet: MiPrimerMidlet.java y presionemos el botón Create Project.
Para ser nuestra primera práctica y antes de que entremos de lleno a conocer los perfiles (MIDP) y las configuraciones (CLDC), seleccionemos la siguiente opción que se muestra en la pantalla y presionemos después el botón OK.
- DefaultPhoneColor
- DefaultGrayPhone
- MediaControlSkin
- QwertyDevice
Monday, November 3, 2008
ADOPTEMOS UN FRAMEWORK
c:\MiDirectorio\javac MiPrograma.java
Instalación de Eclipse
Descomprimimos el fichero eclipse-SDK-3.0-win32.zip que nos acabamos de bajar en el directorio c:\eclipse al que llamaremos de ahora en adelante : eclipse_home.
Nosotros hemos optado por trabajar con la última versión de eclipse 3.0.
Para arrancar la plataforma eclipse basta con ejecutar eclipse.exe que se encuentra dentro eclipse_home.
Y listo, tenemos instalado nuestro framework que nos ahorrará muchos dolores de cabeza al momento de querer compilar nuestro código.
En la próxima emisión veremos cómo se trabaja con él.