Vamos a ver como controlar una pantalla táctil en Android. Esta interfaz nos permite detectar la presencia de un objeto sobre la superficie de la pantalla en cada momento, permitiendo al usuario interactuar con las aplicaciones de una forma similar al ratón o touchpad, solo que en este caso, el input del usuario al sistema(tacto) y el output(imagen) comparten la misma superficie.
Estamos usando como hardware un HTC Dream o G1.
¿Como funciona? Una mirada rápida al hardware:
Existen diferentes tipos de touchscreens que funcionan en base a diferentes principios físicos. Los que más se usan en este tipo de dispositivos son, el resistivo y el capacitivo. (y a muy grandes rasgos)
* En el resistivo, cuando el usuario presiona la superficie de la pantalla, hace entrar en contacto entre sí dos capas conductoras. Según que parte de la superficie presione se cierra un circuito u otro. Cada circuito esta asociado a diferentes valores de resistencia que controlan un corriente que finalmente es leída por la controladora, y traducida a un posición sobre una matriz.

* En el caso de el Touchscreen capacitivo, la variable física a medir es la capacidad y en concreto, la que está asociada al cuerpo humano, que transmite su capacidad al touchscreen(por eso no funciona cuando usamos guantes, por cierto hay quien lo ha resuelto).Por lo demás el funcionamiento es similar al resistivo, solo que en este caso la controladora está leyendo continuamente los distintos puntos de la matriz, detectando cual de ellos es el de contacto.(este tipo de touchscreen es que tiene el G1)
Controlando el Touchscreen sobre Android:
Todo empieza en la actividad principal, indicamos que implemente “OnTouchListener”
que es la clase interfaz que nos permitirá gestionar los eventos relacionados al touchscreen.
package examples.touchExample;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.LinearLayout;
import android.widget.Toast;
import java.lang.StrictMath;
public class touchExample extends Activity implements OnTouchListener{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LinearLayout layMain = (LinearLayout)this.findViewById(R.id.layout_id);
layMain.setOnTouchListener((OnTouchListener) this);
Necesitamos al menos un objeto view, que este asociado al listener del touchscreen, en nuestro caso es “layMain” que es una instancia de la clase LinearLayout, y está definido en el fichero XML correspondiente.
A continuación viene el método que se disparará cuando se produzca cualquier evento sobre el touchscreen.
public boolean onTouch(View v, MotionEvent event) {
//aquí es donde gestionamos los eventos asociados al touch screen.
}
Ahora vamos a ver dos sencillos ejemplos poniendo en práctica esto.
Ejemplo 1: Visualización de la posición de cualquier evento
En este ejemplo cada vez que se produce cualquier evento asociado al touchscreen, capturamos los valores de posición con x = event.getX() y y = event.gety(); y los ponemos sobre un objeto TextView en LinearLayout. El simple resultado es que se imprime continuamente la posición en x,y sobre la pantalla.
public class touchExample1 extends Activity implements OnTouchListener {
private float x = 0;
private float y = 0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LinearLayout layMain = (LinearLayout)this.findViewById(R.id.layout_id);
layMain.setOnTouchListener((OnTouchListener) this);
}
public boolean onTouch(View v, MotionEvent event) {
x = event.getX();
y = event.getY();
String xs = new Float(x).toString();
String ys = new Float(y).toString();
TextView text = (TextView)this.findViewById(R.id.texto);
text.setText("Touchscreen: X="+xs+" Y:"+ys);
return true;
}
}
Ejemplo 2: Gestión de eventos Down and Up
En este segundo ejemplo de todos los eventos asociados al touchscreen, solo gestionamos dos, cuando el usuario pone el dedo sobre el touchscreen y cuando lo levanta, comparando el resultado de event.getAction() con MotionEvent.ACTION_DOWN o MotionEvent.ACTION_UP. En cada caso capturamos la posición de cada evento y comparándolos entre si, detectamos el movimiento del usuario de cuatro posibles, hacia la izquierda, derecha , arriba y abajo.(es muy poco exacto pero para el ejemplo valdrá)
public class touchExample extends Activity implements OnTouchListener{
//punto al pulsar
float xi = 0;
float yi = 0;
//punto al levantar
float xf = 0;
float yf = 0;
//coordenadas relativas
float xr = 0;
float yr = 0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LinearLayout layMain = (LinearLayout)this.findViewById
(R.id.layout_id);
layMain.setOnTouchListener((OnTouchListener) this);
}
public boolean onTouch(View v, MotionEvent event) {
//pulsa
if(event.getAction()==MotionEvent.ACTION_DOWN)
{
xi = event.getX();
yi = event.getY();
}
//levanta
else if(event.getAction()==MotionEvent.ACTION_UP){
xf = event.getX();
yf = event.getY();
yr = yf - yi;
xr = xf - xi;
//es horizontal.
if(StrictMath.abs(xr) >= StrictMath.abs(yr) ){
//izquierda
if(xr>0) printtext("right");
//derecha
else printtext("left");
}
//es vertical
else{
//arriba
if(yr>0) printtext("down");
//abajo
else printtext("up");
}
}
return true;
}
//imprime
void printtext(String text)
{
Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
toast.show();
}
}