Este artículo tiene como objetivo explicar que es, que no es y para qué sirve el API de gestos introducido en Windows Mobile 6.5. Antes de empezar, algunos de ustedes se preguntarán: ¿por qué es importante un API de Windows Mobile 6.5 si ya hay información disponible sobre Windows Phone?, la respuesta es simple, el llamativo touch (y los controles) del Windows Phone fue construido sobre el API de gestos.

El término sombrilla API de gestos cubre el reconocimiento de sonrisas, el touch y el manejo del acelerómetro (Figura 1). La arquitectura de esta API separa el reconocimiento del procesamiento de cada input y deja en manos del OEM el soporte de todos los sensores excepto el touch. Por esta razón la documentación genérica que Microsoft ofrece relativa al API de gestos solo cubre el touch (input recognizer); si necesitas buscar información relativa a acelerómetros o reconocimiento facial debes buscar en la documentación específica del fabricante del dispositivo. Este artículo hace énfasis en el input recognizer.

Figura 1. Reconocimiento y tratamiento separado de mensajes.

 

El input recognizer marca la diferencia entre un simple click de mouse y el API de gestos porque soporta no solo el click derecho sino el scroll, pan, select, hold y doublé select (Figura 2). El concepto más importante detrás de este nuevo componente es el nuevo mensaje WM_GESTURE y el Physics Engine.

 

WM_GESTURE

Para todos los programadores C++ el manejo de los mensajes que recibe la ventana principal de una aplicación es algo cotidiano; para los desarrolladores en código manejado no. El soporte para la nueva interacción (no solo click derecho) es gracias a un nuevo mensaje llamado WM_GESTURE el cual conecta el manejador del evento con el generador del evento para soportar la interacción mostrada en la Figura 2.

Figura 2. Casos soportados por el Input Recognizer.

 

El código para manejar este nuevo mensaje es:

            case WM_GESTURE:

            {

                  GESTUREINFO gi = {sizeof(GESTUREINFO)};

                  if (TKGetGestureInfo((HGESTUREINFO)lParam, &gi))

                  {

                        switch (wParam)

                        {

                        case GID_SELECT:

                             break;

                        case GID_HOLD:

                             break;

                        case GID_DOUBLESELECT:

                             break;

                        case GID_PAN:

                             break;

                        case GID_SCROLL:

                             break;

                        }

 

                  }

            }

Si observaron detenidamente el método TKGetGestureInfo y la estructura GESTUREINFO son los encargados de encapsular toda la funcionalidad, por lo cual si tu aplicación móvil C++ quiere soportar el touch recognizer debes agregar el manejador para ese nuevo mensaje. La buena (y única) noticia para los desarrolladores en código manejado es que el Compact Framework reconocerá ese nuevo input automáticamente.

 

Physics Engine

Cuando interactuamos directamente con nuestros dedos (y fuerza) con la pantalla del dispositivo para por ejemplo desplazar hacia abajo una barra de scroll, nos surge la pregunta: ¿cuál debería ser la respuesta natural correcta en términos de velocidad?. Pues bien, esa misma pregunta se la hicieron los investigadores en Microsoft para saber que tan sensible es el ojo humano frente al movimiento y la respuesta fue el Physics Engine.

 

El Physics Engine es usado para crear animaciones en donde la velocidad y el scroll juegan un papel importante dentro y fuera de los límites de la pantalla. La diferencia con el scroll normal de nuestros equipos desktop es que el usuario cuando desplaza un scroll usando los dedos espera ver desplazamiento natural (“suavizado”) pixel por pixel.

Los siguientes controles utilizan (de fábrica, sin hacerles nada) el Physics Engine:

·         Listview

·         Listbox (incluye el combo)

·         Webview

·         Treeview

·         Tab (scroll left / right to change page)

La mala noticia para los desarrolladores en código manejado (C#/VB.NET) es que las actualizaciones del CF 2.0 ó 3.5 no incluyen nada para el API de gestos, solo el soporte por default antes mencionado, es decir si quieres crear un control para que una ventana permita una interacción natural semejante a la del iPhone o Android debes desarrollarla en C++, que es donde está disponible la estructura PHYSICSENGINEINIT, la cual permite inicializar y manipular el Physics Engine para crear animaciones como la que el usuario espera cuando por ejemplo selecciona un área y la maximiza (Figura 3).

Figura 3. Animación creada con el Physics Engine.

 

Como comente en la introducción, Windows Phone hace uso extensivo de interfaces que responden a la física de los movimientos que nosotros creemos, por ejemplo cuando se  navega de forma horizontal/vertical a través de los Windows Phone hubs.  Finalmente quisiera comentar que siempre tenemos a nuestra disposición el P/Invoke para utilizar la funcionalidad que aún no está disponible en código manejado. Les recomiendo esta fuente para más información y autoestudio: http://msdn.microsoft.com/en-us/magazine/ee309880.aspx

 

Saludos,

Javier Andrés Cáceres Alvis