Bienvenidos sean a este post, los eventos del usuario son aquellos donde permitimos interactuar al usuario con nuestra app, habitualmente son llamados listeners porque quedan escuchando o esperando a que suceda el evento designado. Hasta ahora hemos visto un solo evento y este era para el click sobre un elemento (onClick) pero existen muchos mas, ahora pasaremos a ver algunos mas de los disponibles es la clase View:

Evento Metodo de la interfaz Descripcion
onClick View.OnClickListener Se llama cuando el usuario pulsa el elemento en cuestion
onLongClick View.OnLongClickListener Es cuando el usuario pulsa un elemento y lo mantiene pulsado por mas de un segundo
onFocusChange View.OnFocusChangeListener Es utilizado cuando el usuario pasa de un elemento a otro en la vista
onKey View.OnKeyListener Es utilizado cuando se pulsa una tecla del teclado del dispositivo
onTouch View.OnTouchListener Se activa cuando se pulsa, se suelta o se desplaza en la pantalla tactil
onCreateContextMenu View.OnCreateContextMenuListener Es utilizado cuando se va a crear un menu contextual asociado a un elemento

Las formas de implementarlo son varias, una puede puede ser por medio del evento en el codigo XML de nuestra vista por medio de la linea: android:onClick=”metodo, otra forma es por medio de un enlace entre elemento y codigo Java, veamos un simple ejemplo:

protected void onCreate(Bundle savedState) {
	...
	Button boton = (Button) findViewById(R.id.boton);
	boton.setOnClickListener( new OnClickListener() {
		public void onClick(View v){
			... instrucciones ...
			}
		});
	...
}

Como pueden ver utilizamos el setOnClickListener() para poder escuchar los eventos click sobre el elemento boton y luego cuando se reciba por medio del metodo onClick() ejecutaremos las instrucciones relacionadas al boton, ahora vamos a ver la tercera forma de poder crear este tipo de eventos:

public class Ejemplo exxtends Activity implements OnClickListener {
	protected void onCreate(Bundle savedState) {
		...
		Button boton = (Button) findViewById(R.id.boton);
		boton.setOnClickListener(this);
		...
	}

	public void onClick(View v) {
		... instrucciones ...
	}
	...
}

Como pueden ver ahora utilizamos un metodo llamado implements para que el evento OnClickListener para todo la clase, esto nos permitira despues utilizar el setOnClickListener para el enlace creado entre el elemento y el codigo y utilizamos this, luego por fuera de esto creamos el evento onClick para poder ejecutar las instrucciones relacionadas a este boton, este es la practica mas recomendada por la documentacion de Android porque de esta forma no se gasta tanta memoria y es un poco mejor de entender a la hora de hacer un debug (revision ante un error). Manejarlo de esta forma nos da mayores posibilidades porque podemos implementar los siguientes eventos:

  • onKeyDown(int keyCode, KeyEvent e), cuando se presiona una tecla
  • onKeyUp(int keyCode, KeyEvent e), cuando se deja presionar una tecla
  • onTouchEvent(MotionEvent me), cuando se toca la pantalla tactil

Pasemos a trabajar con el teclado para ello vamos a utilizar a Asteroides para desplazar a nuestra nave, en este caso vamos a crear una forma de interaccion para un determinado tipo de moviles que tienen teclados fisicos, o como hacemos nosotros por medio de un emulador y nuestro teclado pasemos a abrir nuestra app Asteroides con Android Studio y vamos a la clase VistaJuego donde insertaremos el siguiente metodo:

@Override
public boolean onKeyDown(int codigoTecla, KeyEvent evento){
    super.onKeyDown(codigoTecla, evento);
    boolean procesada = true;
    switch(codigoTecla) {
        case KeyEvent.KEYCODE_DPAD_UP:
            aceleracionNave = +PASO_ACELERACION_NAVE;
            break;
        case KeyEvent.KEYCODE_DPAD_LEFT:
            giroNave = -PASO_GIRO_NAVE;
            break;
        case KeyEvent.KEYCODE_DPAD_RIGHT:
            giroNave = +PASO_GIRO_NAVE;
            break;
        case KeyEvent.KEYCODE_DPAD_CENTER:
        case KeyEvent.KEYCODE_ENTER:
            //activaMisil();
            break;
        default:
            procesada = false;
            break;
    }
    return procesada;
}
Nota: Recuerden presionar Alt+Enter cuando se lo solicite el codigo para agregar el paquete encargado de los eventos para la deteccion de las teclas.

Como pueden ver aca agregamos un evento para cuando se presiona una tecla (keyDown) donde setearemos a una variable de tipo boolean el nombre procesada y con el valor true (verdadero) porque consideraremos que una tecla fue presionada, luego utilizaremos un switch() para detectar que tecla fue presionada, en este caso nos centraremos en tres, la primera es la tecla hacia arriba para acelerarlo, la tecla de izquierda para que gire a la izquierda y la derecha para que gire a la derecha, despues tendremos dos eventos mas, una para la tecla CENTER (¿?) que no tiene asignada ninguna instruccion y por ultimo el ENTER para disparar un misil pero como pueden ver la instruccion esta comentada porque no existe todavia este metodo, luego viene default, el cual sera considerado en el caso de no haber sido presionada ninguna tecla, por ultimo salimos del switch() y retornamos el valor de procesada.

Nota: Para que funcione esto, deben verificar que en el layout XML, en este caso juego.xml, debe tener la propiedad android:focusable="true".

Ahora si probamos nuestro juego obtendremos el siguiente resultado

Pero como vemos no es el resultado deseado, esto es debido a que utilizamos onKeyDown en lugar de onKeyUp, es decir captamos el evento de cuando es presionado pero no cuando es liberado por ende queda como un eterno boton apretado, vamos a hacer la siguiente modificacion en nuestro metodo:

@Override
public boolean onKeyUp(int codigoTecla, KeyEvent evento){
    super.onKeyUp(codigoTecla, evento);
    ... El resto debera quedar como antes ...
}

Como pueden ver ahora modificamos el tipo de evento pasamos de cuando presionamos la tecla a cuando soltamos la tecla, si lo probamos veremos que ahora funciona un poco mejor pero seguimos con el inconveniente de que no para de girar cuando presionamos hacia arriba, realicemos la siguiente modificacion para mejorar nuestro codigo:

@Override
public boolean onKeyDown(int codigoTecla, KeyEvent evento){
    super.onKeyDown(codigoTecla, evento);
    boolean procesada = true;
    switch(codigoTecla) {
        case KeyEvent.KEYCODE_DPAD_UP:
            aceleracionNave = +PASO_ACELERACION_NAVE;
            break;
        case KeyEvent.KEYCODE_DPAD_LEFT:
            giroNave = -PASO_GIRO_NAVE;
            break;
        case KeyEvent.KEYCODE_DPAD_RIGHT:
            giroNave = +PASO_GIRO_NAVE;
            break;
        case KeyEvent.KEYCODE_ENTER:
            //activaMisil();
            break;
        default:
            procesada = false;
            break;
    }
    return procesada;
}

@Override
public boolean onKeyUp(int codigoTecla, KeyEvent evento){
    super.onKeyUp(codigoTecla, evento);
    boolean procesada = true;
    switch(codigoTecla) {
        case KeyEvent.KEYCODE_DPAD_UP:
            aceleracionNave = 0;
            break;
        case KeyEvent.KEYCODE_DPAD_LEFT:
        case KeyEvent.KEYCODE_DPAD_RIGHT:
            giroNave = 0;
            break;
        default:
            procesada = false;
            break;
    }
    return procesada;
}

Como pueden ver ahora dejamos el primer metodo como al principio pero luego agregamos un metodo para justamente interceptar cuando se suelta el boton y seteando los valores de aceleracionNave y giroNave en cero, en este caso a mi no me funciono muy bien pero si es verdad que no se quedo girando constantemente pero si no pude detenerlo cuando comenzo a avanzar pero eso puede ser debido a que el emulador no funciona correctamente con las teclas direccionales del teclado de mi laptop, a parte de necesitar mas recursos porque hasta ahora funciona bastante lento pero sacando esto nos sirve para ver como se pueden utilizar eventos para capturar distintos elementos e interactuar con ellos.
En resumen, hoy hemos visto que son y para que se utilizan los eventos, como pueden ser utilizados, de que forma y como pueden ayudarnos en la interaccion del usuario con nuestra app, espero les haya sido util sigueme en Twitter, Facebook o Google+ para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios