Gestes tactiles

Vous pouvez accéder aux données brutes à partir du pavé tactile Glass avec le SDK Android.

Toutefois, GDK fournit un détecteur de gestes qui détecte automatiquement les gestes courants dans Glass, comme les gestes d'appui, de balayage et de défilement.

De plus, les gestes simples sont traduits par défaut en événements du pavé directionnel pour un traitement facile sans utiliser de détecteur de gestes.

Détecter les gestes en tant qu'événements du pavé directionnel

Par défaut, le système Glass traduit les gestes simples en touches de pavé directionnel. Cela vous permet d'écouter des événements onKeyDown() et onKeyUp() sur des activités ou des vues pour traiter les gestes suivants en tant que touches du pavé directionnel:

L'extrait de code suivant détecte les utilisateurs qui appuient sur le pavé tactile:

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

Pour détecter les appuis sur des vues individuelles, vous pouvez implémenter OnClickListener pour la vue. Lorsque les utilisateurs appuient sur le pavé tactile (traduit en cliquant sur le bouton central du pavé directionnel) avec la vue en surbrillance, celle-ci peut gérer l'événement avec un 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
    }
}

Détecter des gestes avec un détecteur de gestes

Les détecteurs de gestes vous permettent de détecter des gestes simples ainsi que des gestes plus complexes, comme ceux qui utilisent plusieurs doigts ou font défiler l'écran. Les gestes complexes n'ont pas de pavé directionnel correspondant.

GestureDetector fournit des interfaces d'écouteur que vous pouvez implémenter pour être averti d'un geste.

Détecter des gestes au niveau de l'activité

La détection des gestes au niveau de l'activité est appropriée lorsque vous ne vous souciez pas de savoir quelle partie de votre UI est axée. Par exemple, si vous souhaitez afficher un menu lorsque les utilisateurs appuient sur le pavé tactile, quelle que soit la vue sélectionnée, vous devez gérer le MotionEvent dans l'activité.

L'exemple suivant :

  1. Crée une GestureDetector qui implémente les écouteurs pour traiter les gestes reconnus.
  2. Remplace la méthode onGenericMotionEvent() de l'activité pour transmettre les événements de mouvement à la méthode onMotionEvent() du détecteur de gestes.

Lorsqu'un événement de mouvement se produit, le système le transmet au détecteur de gestes. S'il est reconnu, le détecteur de geste informe l'écouteur approprié du traitement de l'événement.

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

Détecter des gestes au niveau de la vue

La détection des gestes au niveau de la vue est appropriée lorsque vous souhaitez effectuer différentes actions en fonction de la vue sélectionnée.

L'exemple suivant :

  1. Crée une vue personnalisée qui remplace la méthode dispatchGenericFocusedEvent(). Lorsqu'un événement de mouvement se produit, cette méthode la transmet au détecteur de gestes.
  2. Déclare que la vue est sélectionnable afin qu'elle détecte les événements lorsqu'elle est sélectionnée.
  3. Crée une classe GestureDetector qui met en œuvre les écouteurs pour traiter les gestes reconnus.

Lorsque le détecteur de gestes reconnaît un mouvement alors que la vue est active, il appelle l'écouteur approprié.

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