miércoles, 13 de julio de 2011

Los gestos en Android

Hoy para empezar os dejo un link muyyyy bueno de como implementar gestos especificos en android http://developer.android.com/resources/articles/gestures.html


(Voy a obviar la creación de un proyecto en android y la explicación de los ficheros que conciernen a ellos porque esta entrada trata de gestos, en posteriores entrada explicares como se hace un proyecto android de cero)

Lo primero que hay que hacer para implementar un programa que utilice gestos en android, es crearlos, ¿como se crean? Pues facilmente con la aplicación Gestures Builder que viene en las API Demos de android de cada versión desde la 1.6 .


Lo que yo hice fue crearme un proyecto nuevo de android importandome  las API Demos:


Eligiendo el proyecto mencionado anteriormente, luego lo compile y lo arranque en mi movil android. Este programa te permite definir tus gestos para finalmente guardarlos en un fichero dentro de la tarjeta SDCard , lo podreis encontrar aqui /sdcard/gestures . Una vez hecho esto os tendreis que llevar este ficherito al proyecto donde querais reconocer los gestos y ponerlo en la carpeta /res/raw/gestures (posiblemente bajo de res no tendreis creada la carpeta raw, la creas como una carpeta normal con eclipse y ya esta).




El siguiente paso es iros a vuestro fichero XML de vista (en mi caso se llama main.xml alojado en /res/layout/main ) y le añadiis lo siguiente:


        <android.gesture.GestureOverlayView
        android:id="@+id/gestures" android:layout_width="fill_parent"
        android:layout_height="0dip" android:layout_weight="1.0" />


Esto se trata de una vista que utiliza android especificamente para el tema de los gestos, por eso hay que especificar el path de la librería android.gesture.GestureOverlayView ya que no corresponde con ninguna clase estandard de android.

Una vez modificado el fichero main.xml , nos vamos a la clase GesturesDemoActivity (vamos la clase que implementa la actividad principal que le hayamos definido en nuestro fichero manifest ) . Para empezar tendremos que añadir en el metodo onCreate el siguiente codigo:

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        myGesturesLibrary = GestureLibraries.fromRawResource(this,
                R.raw.gestures);
        if (!myGesturesLibrary.load()) {
            finish();
        }

        // It adds the gesture area to register the gestures of the user
        GestureOverlayView gestures = (GestureOverlayView)                 findViewById(R.id.gestures);
        gestures.addOnGesturePerformedListener(this);


Elementos a destacar en este codigo,  tendremos que definirnos una variable dentro de la clase que se llame GestureLibrary myGesturesLibrary; que sera donde carguemos todos los gestos que nos hayamos definido con el programa GesturesBuilder.

Lo siguiente que hacemos es mediante el metodo load() cargamos los gestos, si no nos salimos del programa ya que de otra forma nos lanzara excepciones la demo.


La ultima parte del metodo onCreate, registra un GesturePerformedListener en nuestra GestureOverlayView para que podamos reaccionar a los eventos que ocurran en la pantalla. Cabe aclarar que el listener lo vamos a definir nosotros dentro de la clase GesturesDemoActivity por lo tanto hay que añadir en la cabecera lo siguiente implements OnGesturePerformedListener, de este modo nos podremos definir el siguiente metodo:


public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
        ArrayList<Prediction> predictions = myGesturesLibrary
                .recognize(gesture);

        // We want at least one prediction
        if (predictions.size() > 0) {
            Prediction prediction = predictions.get(0);
            // We want at least some confidence in the result
            if (prediction.score > 1.0) {
                // Show the spell
                Toast.makeText(this, prediction.name, Toast.LENGTH_SHORT)
                        .show();
            }
        }
    }


A este metodo se entrara cuando se detecte un gesto en la  GestureOverlayView y sera el momento de utilizar la libreria de gestos que hemos introducido en nuestro proyecto para llamar al metodo .recognize(gesture) que apartir del gesto que recibe como parametro realiza una serie de predicciones o predictions que guarda en una ArrayList
Una vez tenemos la lista de predicciones podemos recorrerla y ver cual es la predicción que ha obtenido mayor score, en este caso mostramos solamente predicciones que tengan un score superior a 1.0 (por debajo son predicciones malas que no coincidirian con el gesto hecho).

Y finalmente lo que se ha hehco es mostrar el nombre de la predicción, que es el mismo nombre que nos hemos guardado con el programita Gestures Builder 




Bueno agradeceros a los que hayais leido o a los que hayais entrado a ver esta entrada y si teneis alguna duda o necesitais alguna aclaración, por favor no dudeis en pedirla.
 

Muchas gracias y buenos dias

No hay comentarios:

Publicar un comentario