Gesti di tocco

L'accesso ai dati non elaborati dal touchpad di Glass è possibile con l'SDK Android,

Tuttavia, GDK fornisce un rilevatore di gesti che rileva automaticamente i gesti comuni su Glass, inclusi controlli di tocco, scorrimento e scorrimento.

Inoltre, i semplici gesti vengono tradotti in eventi D-pad per impostazione predefinita per facilitarne l'elaborazione senza utilizzare un rilevatore di gesti.

Rilevamento dei gesti come eventi principali del D-pad

Per impostazione predefinita, il sistema Glass traduce semplici gesti in eventi chiave del D-pad. In questo modo puoi ascoltare gli eventi onKeyDown() e onKeyUp() su attività o visualizzazioni per elaborare i seguenti gesti come tasti D-pad:

Il seguente snippet rileva quando gli utenti toccano il 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);
    }
}

Un metodo per rilevare i tocchi sulle singole viste è implementare OnClickListener per la vista. Quando gli utenti toccano il touchpad (Traduzione come clic con il pulsante centrale del D-pad) con la vista in primo piano, la vista può gestire l'evento con 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
    }
}

Rilevamento dei gesti con un rilevatore di gesti

Con i rilevatori dei gesti puoi rilevare gesti semplici e gesti più complessi, ad esempio quelli che utilizzano più dita o che scorrono. I gesti complessi non hanno una chiave D-pad corrispondente.

Il GetetryRilevator fornisce interfacce per gli ascoltatori che puoi implementare per ricevere una notifica di un Gesto.

Rilevamento dei gesti a livello di attività

Il rilevamento dei gesti a livello di attività è appropriato quando non è importante quale parte dell'interfaccia utente è attiva. Ad esempio, se vuoi visualizzare un menu quando gli utenti toccano il touchpad, a prescindere dalla visualizzazione che hai impostato, dovrai gestire MotionEvent all'interno dell'attività.

L'esempio seguente:

  1. Crea un elemento GestureDetector che implementa gli ascoltatori per elaborare i gesti riconosciuti.
  2. Esegue l'override del metodo onGenericMotionEvent() dell'attività per passare gli eventi di movimento al metodo onMotionEvent() del rilevatore di gesti.

Quando si verifica un evento di movimento, il sistema lo trasmette al rilevatore di gesti. Se riconosciuto, il rilevatore di gesti avvisa l'ascoltatore appropriato per elaborare l'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;
    }
}

Rilevamento dei gesti a livello di vista

Il rilevamento dei gesti a livello di vista è appropriato quando vuoi fare cose diverse a seconda della visualizzazione attiva.

L'esempio seguente:

  1. Crea una visualizzazione personalizzata che sostituisce il metodo dispatchGenericFocusedEvent(). Quando si verifica un evento di movimento, questo metodo trasmette l'evento di movimento al rilevatore di gesti.
  2. Dichiara che la vista è attivabile in modo che rilevi gli eventi quando è attiva.
  3. Crea un elemento GestureDetector che implementa gli ascoltatori per elaborare i gesti riconosciuti.

Quando il rilevatore del gesto riconosce un movimento mentre la vista è a fuoco, il rilevatore chiama l'ascoltatore appropriato.

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