miércoles, 20 de febrero de 2013

Tutorial Crear y reconocer gestos con Gesture View (GestureOverlayView) en Android

Buenos días!
Hoy os presento un tutorial muy muy interesante. Se trata de utilizar el objeto GestureOverlayView (reconocedor de gestos) para que reconozca los números del 1 al 9. Es sólo en este tutorial claro ya que se puede utilizar para reconocer cualquier cosa tal y como vamos a ver hoy.

Lo que vamos a aprender hoy puede tener infinitos usos, ya sea para conseguir poder escribir a mano alzada en nuestra aplicación o para hacer más rápida la navegación dentro de la aplicación mediante símbolos personalizados.

Este tutorial consta de dos partes bastante diferenciadas, una es la de crear nuestra librería de gestos (es este caso números) y la segunda parte es como añadir esta librería al GestureOverlayView para que los reconozca en directo.




Crear librería con nuestros gestos personalizados (Custom Gesture)
Para crear la librería con nuestros propios gestos es muy simple, necesitaremos el emulador del SDK de Android (AVD) y encender nuestro emulador con almenos la versión 1.6 de Andrpoid. En ésta y en las posteriores versiones viene instalado un software llamado Gestures Builder que nos ará toda la faena. A continuación pongo una captura de pantalla y una pequeña explicación.


Como vemos en las impresiones de pantalla simplemente hay que ir añadiendo los símbolos  en este caso números, que queramos que reconozca la aplicación. En este ejemplo vemos que hemos repetido los números dos veces, yo aconsejo hacer más de una repetición de número para tener un abanico más amplio de gestos. 
Como vemos en la segunda imagen los gestos se van guardando en un archivo /mnt/sdcard/gestures para sacar ese archivo del emulador hacia nuestro Pc para utilizarlo posteriormente en nuestra aplicación se haría con la aplicación \sdk\tools\ddms.exe ó \sdk\tools\monitor.exe se ahía de la siguiente manera:

De esta manera ya tendremos nuestro archivo personalizado de gestures en nuestr Pc listo para importar en nuestro proyecto.

Posibles errores
Si al entrar a la aplicación de Gesture Builder aparecere este error que dice  Could not load /mnt/sdcard/gestures. Make sure you have storage avaiable. Hay que ir a nuestro AVD a ver el emulador de android que tenemos creado, darle a modificar y añadirle un SdCard con al menos 50Mb. 

Trabajar con Gesture en Eclipse
Una vez que ya tenemos nuestro archivo gesture en nuestro escritorio vamos a ver como se tendría que hacer en eclipse para utilizarlo.
Como siempre necesitaremos el codigo de layout, en este caso con el componente de GestureOverlayView ocupando toda la pantalla ya que solo es un ejemplo:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <android.gesture.GestureOverlayView
        android:id="@+id/gestureOverlayView1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true" >
    </android.gesture.GestureOverlayView>

</RelativeLayout>
Una vez tengamos ya el simple layout con solo ese componente vamos a la clase del Activity, dejo el código acontinuación completamente comentado:
//Implementamos el OnGesturePerformedListener para que el codigo no sea muy pesado
public class MainActivity extends Activity implements OnGesturePerformedListener{
//Creamos el componente para relacionarlo con el XML
//Y el gesture library para rescatar el archivo que hemos
//creado anteriormente
private GestureOverlayView gesture;
private GestureLibrary gLibrary;
 
@Override
protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 //Relacionamos con el XML
 gesture = (GestureOverlayView)findViewById(R.id.gestureOverlayView1);
 //Le añadimos el listener
 gesture.addOnGesturePerformedListener(this);    
 //Creamos la carpeta res/raw y añadimos el archivo gestures
 //añadimos el raw al gLibrary
 gLibrary = GestureLibraries.fromRawResource(this, R.raw.gestures);
 //lo cargamos...
 gLibrary.load();

}
//Al obtener algun gesto...
@Override
public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
 //añadimos los diferentes resultados obtenidos 
 //ya comparados con nuestro archivo y ordenados de mas fiable a menos
 ArrayList<Prediction> predictions = gLibrary.recognize(gesture); 
 //Si a encontraod algun resultado
 if (predictions.size() > 0) {
  //En este caso solos nos interesa el gesto que más se parezca
  Prediction prediction = predictions.get(0);
  //Miramos que tengo un parecido mínimo
  if (prediction.score > 1.5) {
  //Decimos lo que ha escrito
  Toast.makeText(this, prediction.name,Toast.LENGTH_SHORT).show();
  }else{
  //Si no supera el 1.5 de fiabilidad..
     Toast.makeText(this, "No se ha reconocido.",Toast.LENGTH_SHORT).show();
  }
 }  
}
}
Adjunto vídeo para que podáis entender mejor el ejercicio:


Muchas gracias a todos y no olviden escribir sus dudas o comentarios!!! :D 

4 comentarios:

  1. hola

    como descargar gestores por-favor

    ResponderEliminar
    Respuestas
    1. No hay que descargarlo, se encuentra dentro del emulador a partir de la versión 2.3
      Gracias!

      Eliminar
  2. Perfecto, el único ejemplo que me funcionó, gracias.

    ResponderEliminar