Gestos de toque

O acesso a dados brutos no touchpad do Glass é possível com o SDK do Android.

No entanto, o GDK oferece que é um detector de gestos, detecta automaticamente gestos comuns no Google Glass, incluindo tocar, deslizar e rolar.

Além disso, gestos simples são traduzidos em eventos D-pad por padrão para facilitar o processamento sem usando um detector de gestos.

Detectar gestos como eventos de tecla do botão direcional

Por padrão, o sistema do Google Glass traduz gestos simples em eventos de tecla do botão direcional. Isso permite que você ouça onKeyDown() e onKeyUp() eventos em atividades ou visualizações para processar os seguintes gestos como teclas do botão direcional:

O snippet abaixo detecta quando os usuários tocam no touchpad:

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);
    }
}

Um método para detectar toques em visualizações individuais é implementar OnClickListener para a visualização. Quando os usuários tocam no touchpad (traduzido como um clique no botão central do botão direcional) com a visualização em foco, ela pode manipular o evento com uma 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
    }
}

Como detectar gestos com um detector de gestos

Os detectores de gestos também permitem detectar gestos simples como gestos mais complexos, como aqueles que usam vários dedos ou rolagem. Complexos gestos não têm uma tecla D-pad correspondente.

O GestureDetector fornece interfaces de listener que podem ser implementadas receber notificações sobre um gesto.

Como detectar gestos no nível da atividade

Detectar gestos no nível da atividade é apropriado quando você não se importa com qual parte da interface tem foco. Por exemplo, se você quiser abrir um menu quando os usuários tocam no touchpad, independentemente da visualização em foco, você lidaria com MotionEvent dentro da atividade.

No exemplo a seguir:

  1. Cria um GestureDetector. que implementa listeners para processar gestos reconhecidos.
  2. Substitui o método onGenericMotionEvent() da atividade para transmitir os eventos de movimento ao método onMotionEvent().

Quando ocorre um evento de movimento, o sistema o passa para o detector de gestos. Se reconhecido, o detector de gestos notifica o listener apropriado para o 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;
    }
}

Como detectar gestos no nível da visualização

A detecção de gestos no nível da visualização é apropriada quando você fazer coisas diferentes dependendo da visualização em foco.

No exemplo a seguir:

  1. Cria uma visualização personalizada que substitui a dispatchGenericFocusedEvent() . Quando ocorre um evento de movimento, esse método passa o evento de movimento para o detector de gestos.
  2. Declara a visualização como focalizável para que ela detecte eventos quando tiver foco.
  3. Cria um GestureDetector que implementa para processar gestos reconhecidos.

Quando o detector de gestos reconhece um movimento enquanto a visualização está em foco, ele chama o listener apropriado.

/**
 * 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;
    }
}