La pantalla táctil

Los teléfonos Android suelen incorporar una pantalla táctil, que es utilizada como dispositivo principal de entrada. El uso más importante de la pantalla táctil es como sustituto del ratón de un ordenador de sobremesa. De esta forma podemos seleccionar, arrastrar y soltar cualquier elemento de la pantalla de forma sencilla. No obstante el uso de este dispositivo no acaba aquí. Suele utilizarse en sustitución del teclado en aquellos dispositivos que no disponen de teclado físico. También puede ser utilizada como entrada de un videojuego, como se verá en este apartado. Otra alternativa para usar la pantalla táctil consiste en el uso de gestures soportado a partir del SDK 1.6. Las gestures serán estudiadas en el siguiente punto. Otro abanico de nuevas posibilidades se abre con el multi-touch, soportado a partir del SDK 2.0. 

 

El manejo básico de la pantalla táctil pasa por definir el método OnTouchEventen una clase View (o implementar la interfaz OnTouchListener en otras clases). Este método nos devolverá en un parámetro, un objeto de la clase MotionEvent.

Los métodos más interesantes de la clase MotionEvent se indican a continuación:

getAction() Tipo de acción realizada. En API level 1 puede ser: ACTION_DOWN, ACTION_MOVE, ACTION_UPo ACTION_CANCEL.

getX(), getY() posición de la pulsación.

getDownTime() Tiempo en ms en que el usuario presionó por primera vez en una cadena de eventos de posición.

getEventTime() Tiempo en ms del evento actual.

getPressure() Estima la presión de la pulsación. El valor 0 es el mínimo, el valor 1 representa una pulsación normal.

getSize() Valor escalado en 0 y 1 que estima el grosor de la pulsación.

A partir del API level 5 estos métodos pueden indicar como parámetro un índice de puntero para decirle al sistema sobre cuál de los distintos punteros estamos consultando.

 

Ejercicio paso a paso: Uso de la pantalla táctil

En este ejercicio se mostrará cómo podemos capturar los eventos procedentes de la pantalla táctil. También se aprovechará para repasar otros conceptos, como: Creación de Layouts y herramientas de revisión de código en Eclipse.

1. Crea un nuevo proyecto con nombre PantallaTactilEl nombre de la actividad principal debe de ser, PantallaTactilActivity.

2. Modifica el Layout main.xml para que tenga una apariencia similar a la siguiente. De esta forma practicarás la creación de Layouts. A la derecha se muestra la estructura de vistas que contiene.

3. Una posible solución se muestra a continuación:


<LinearLayout

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:orientation="vertical" >

    <TextView

        android:id="@+id/TextViewEntrada"

        android:layout_width="fill_parent"

        android:layout_height="0dp"

        android:layout_weight="1"

        android:text="Pulsa sobre esta vista"

        android:gravity="center"

        android:background="#0000FF"

        android:layout_margin="2mm"

        android:textSize="10pt"/>

    <ScrollView

        android:id="@+id/scrollView1"

        android:layout_width="fill_parent"

        android:layout_height="0dp"

        android:layout_weight="1" >

        <TextView

            android:id="@+id/TextViewSalida"

            android:layout_width="fill_parent"

            android:layout_height="fill_parent"

            android:text="Pulsaciones:"/>

    </ScrollView>

</LinearLayout>

4. Introduce las siguientes dos líneas al final del método onCreate():

TextView entrada = (TextView)findViewById(R.id.TextViewEntrada);

entrada.setOnTouchListener(this);

5. Pulsa Shift-Ctrl-O para añadir los imports.

6. Observa como el método setOnTouchListener está marcado como erróneo. Si pones el cursor encima, te indicará que el parámetro de este método (this) es de la clase PantallaTactilActivity, y es necesario que sea de tipo OnTouchListener.

7. Para evitar el error te mostrará una lista de posibles soluciones. Selecciona la última “Lef  ‘PantallaTactilActivity’ implement ‘OnTouchListener’” de esta forma implementaremos este interfaz y nuestra clase podrá ser considerada de este tipo. La declaración de la clase cambiará a:

public class PantallaTactilActivity extends Activity 
                                                                        implementsOnTouchListener {

8. Se ha solucionado el problema anterior, pero ha aparecido otro. Ahora, la PantallaTactilActivity está marcada como errónea. El problema consiste en que estamos diciendo que implementamos el interfaz OnTouchListener pero no hemos implementado ninguno de los métodos de este interfaz.

9. Para evitar el error selecciona en la lista de posibles soluciones: Add unimplemented methods” de esta forma se añadirán todos los métodos necesarios de este interfaz. La declaración de la clase cambiará a:

public boolean onTouch(View arg0, MotionEvent arg1) {

   // TODO Auto-generated method stub

   return false;

}

10. Reemplaza el nombre de los parámetros por otros más expresivos. Por ejemplo: arg0 por vista y arg1 por evento.

11. Observa como este método ha de devolver un parámetro. Actualmente es false, que significa que no nos hemos hecho cargo de la pulsación, el sistema seguirá pasando este evento a otras vistas. En este caso el LinearLayout que contiene la vista. Cámbialo a true, para que el sistema no siga propagando este evento.

12. Reemplaza la línea “// TODO Auto-generated method stub“ por:

      TextView salida = (TextView) findViewById(R.id.TextViewSalida);

salida.append(evento.toString()+"\n" );

13. Ejecuta el proyecto y verifica el resultado.

acction=0 significa que se ha pulsado sobre la pantalla, acction=1 significa que se ha soltado yacction=2 que se está desplazando el dedo. (estos tres valores corresponden con las constantesMotionEvent.ACTION_DOWN, MotionEvent.ACTION_UP y MotionEvent.ACTION_MOVE)

14. Modifica el proyecto para que cuando el móvil se ponga en apaisado el Layout que se visualice sea:

 

16. Verifica el resultado en un dispositivo real.

17. No todas las pantallas táctiles soportan los métodos getPression() y getSize(). Prueba con tu terminal si lo soporta y en tal caso observa el rango de valores que obtienes.

18.  Conéctate a www.androidcurso.com y localiza el ejercicio que acabas de realizar. Comprueba los valores obtenidos con otros terminales y comparte los valores obtenidos por tu terminal.