Gestos táctiles

Es posible acceder a datos sin procesar desde el panel táctil de Glass con el SDK de Android.

Sin embargo, el GDK proporciona de gestos que detecta automáticamente gestos comunes en Glass, como tocar, deslizar y desplazarse.

Además, los gestos simples se traducen en Eventos de pad direccional de forma predeterminada para un procesamiento fácil sin con un detector de gestos.

Detección de gestos como eventos de teclas del pad direccional

De forma predeterminada, el sistema Glass traduce gestos simples en eventos clave del pad direccional. Esta te permite escuchar onKeyDown() y onKeyUp() eventos en actividades o vistas para procesar los siguientes gestos como teclas del pad direccional:

El siguiente fragmento detecta cuando los usuarios presionan el panel táctil:

public class MyActivity extends Activity {
    ...
    @Override
    public boolean onKeyDown(int keycode, KeyEvent event) {
        if (keycode == KeyEvent.KEYCODE_DPAD_CENTER) {
            // user tapped touchpad, do something
            return true;
        }
        ...
        return super.onKeyDown(keycode, event);
    }
}

Un método para detectar toques en vistas individuales es implementar OnClickListener para la vista. Cuando los usuarios presionan el panel táctil (traducido como un clic en el botón central de un pad direccional) con la vista enfocada, esta puede controlar el evento con una OnClickListener

public final class MyActivity extends Activity implements OnClickListener {

    View cardView;

    @Override
    protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        cardView = new Card(this).setText("Tap to carry out an action").getView();
        // To receive touch events from the touchpad, the view should be focusable.
        cardView.setOnClickListener(this);
        cardView.setFocusable(true);
        cardView.setFocusableInTouchMode(true);
        setContentView(cardView);
    }

    @Override
    protected void onResume() {
        // To receive touch events from the touchpad, the view should have focus.
        cardView.requestFocus();
        super.onResume();
    }

    @Override
    public void onClick(View v) {
        // perform desired action
    }
}

Cómo detectar gestos con un detector de gestos

Los detectores de gestos también te permiten detectar gestos simples como gestos más complejos, como las que usan varios dedos o el desplazamiento. Complejos los gestos no tienen una tecla del pad direccional correspondiente.

GestureDetector ofrece interfaces de objetos de escucha que puedes implementar para recibir la notificación de un gesto.

Cómo detectar gestos a nivel de la actividad

Es apropiado detectar gestos a nivel de la actividad cuando no te importa qué parte de la IU esté enfocado. Por ejemplo, si quieres que aparezca un menú cuando los usuarios presionan el panel táctil, independientemente de la vista enfocada, debes procesar el MotionEvent dentro de la actividad.

En el ejemplo siguiente, se realizan estas acciones:

  1. Crea un GestureDetector. que implementa objetos de escucha para procesar gestos reconocidos.
  2. Anula el método onGenericMotionEvent() de la actividad para pasar los eventos de movimiento al detector de gestos onMotionEvent().

Cuando ocurre un evento de movimiento, el sistema lo pasa al detector de gestos. Si reconocido, el detector de gestos notifica al objeto de escucha apropiado para que procese el evento.

public class MainActivity extends Activity {
    private GestureDetector mGestureDetector;
    // ...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // ...
        mGestureDetector = createGestureDetector(this);
    }

    private GestureDetector createGestureDetector(Context context) {
    GestureDetector gestureDetector = new GestureDetector(context);
        //Create a base listener for generic gestures
        gestureDetector.setBaseListener( new GestureDetector.BaseListener() {
            @Override
            public boolean onGesture(Gesture gesture) {
                if (gesture == Gesture.TAP) {
                    // do something on tap
                    return true;
                } else if (gesture == Gesture.TWO_TAP) {
                    // do something on two finger tap
                    return true;
                } else if (gesture == Gesture.SWIPE_RIGHT) {
                    // do something on right (forward) swipe
                    return true;
                } else if (gesture == Gesture.SWIPE_LEFT) {
                    // do something on left (backwards) swipe
                    return true;
                }
                return false;
            }
        });
        gestureDetector.setFingerListener(new GestureDetector.FingerListener() {
            @Override
            public void onFingerCountChanged(int previousCount, int currentCount) {
              // do something on finger count changes
            }
        });
        gestureDetector.setScrollListener(new GestureDetector.ScrollListener() {
            @Override
            public boolean onScroll(float displacement, float delta, float velocity) {
                // do something on scrolling
            }
        });
        return gestureDetector;
    }

    /*
     * Send generic motion events to the gesture detector
     */
    @Override
    public boolean onGenericMotionEvent(MotionEvent event) {
        if (mGestureDetector != null) {
            return mGestureDetector.onMotionEvent(event);
        }
        return false;
    }
}

Cómo detectar gestos a nivel de la vista

La detección de gestos en el nivel de la vista es apropiada cuando queremos hacer cosas diferentes según la vista que esté enfocada.

En el ejemplo siguiente, se realizan estas acciones:

  1. Crea una vista personalizada que anula la dispatchGenericFocusedEvent() . Cuando se produce un evento de movimiento, este método pasa el evento de movimiento al detector de gestos.
  2. Declara la vista como enfocable para que detecte eventos cuando está enfocada.
  3. Crea un GestureDetector que implementa. y objetos de escucha para procesar gestos reconocidos.

Cuando el detector de gestos reconoce un movimiento mientras la vista está en foco, llama al objeto de escucha correspondiente.

/**
 * TextView that handles touchpad input (currently only TAP).
 */
public class TouchpadHandlingTextView extends TextView
        implements OnAttachStateChangeListener{

    private final GestureDetector mTouchDetector;

    public TouchpadHandlingTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mTouchDetector = createGestureDetector(context);
        // must set the view to be focusable
        setFocusable(true);
        setFocusableInTouchMode(true);
    }

    public TouchpadHandlingTextView(Context context) {
        this(context, null);
    }

    @Override
    public void onViewAttachedToWindow(View v) {
        requestFocus();
    }

    @Override
    public void onViewDetachedFromWindow(View v) {
    }

    /**
     * Pass a MotionEvent into the gesture detector
     */
    @Override
    public boolean dispatchGenericFocusedEvent(MotionEvent event) {
        if (isFocused()) {
            return mTouchDetector.onMotionEvent(event);
        }
        return super.dispatchGenericFocusedEvent(event);
    }

    /**
     * Create gesture detector that triggers onClickListener. Implement
     * onClickListener in your Activity and override
     * onClick() to handle the "tap" gesture.
     */
    private GestureDetector createGestureDetector(Context context) {
        GestureDetector gd = new GestureDetector(context);
        gd.setBaseListener(new GestureDetector.BaseListener() {

            @Override
            public boolean onGesture(Gesture gesture) {
                if (gesture == Gesture.TAP) {
                    return performClick();
                }
                return false;
            }
        });
        return gd;
    }
}