Kliknięcia

Dostęp do nieprzetworzonych danych z touchpada Glass jest możliwy dzięki pakiet SDK do Androida.

GDK zapewnia jednak detektor gestów, automatycznie wykrywa typowe gesty na Google Glass, w tym dotykać, przesuwać i przewijać.

Proste gesty są tłumaczone na Domyślnie zdarzenia na padzie kierunkowym ułatwiają przetwarzanie bez za pomocą wykrywania gestów.

Wykrywanie gestów jako kluczowych zdarzeń na padzie kierunkowym

Domyślnie system Glass tłumaczy proste gesty na kluczowe zdarzenia na padzie kierunkowym. Ten pozwala słuchać onKeyDown() i onKeyUp() za pomocą zdarzeń dotyczących działań lub widoków, aby przetworzyć te gesty jako klawisze na padzie kierunkowym:

Ten fragment kodu wykrywa, kiedy użytkownik naciska 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);
    }
}

Metodą wykrywania kliknięć w poszczególnych wyświetleniach jest implementacja OnClickListener dla danego widoku. Gdy użytkownicy dotykają touchpada (jako kliknięcie środkowego przycisku na padzie kierunkowym) może on obsługiwać zdarzenie za pomocą funkcji 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
    }
}

Wykrywanie gestów za pomocą detektora gestów

Detektory gestów pozwalają też wykrywać proste gesty bardziej złożone gesty, na przykład palcami lub przewijaniem. Skomplikowane gesty nie mają przypisanego klawisza na padzie kierunkowym.

GestureDetector udostępnia interfejsy detektora, które można wdrożyć otrzymywać powiadomienia o Gestach.

Wykrywanie gestów na poziomie aktywności

Wykrywanie gestów na poziomie aktywności jest odpowiednie gdy nie zależy Ci na tym, który element interfejsu użytkownika ma skupienie. Jeśli na przykład chcesz wyświetlić menu gdy użytkownicy dotykają touchpada, niezależnie od ostrości obrazu. odpowiadasz za MotionEvent w ramach aktywności.

Ten przykład:

  1. Tworzy GestureDetector który wykorzystuje detektory do przetwarzania rozpoznanych gestów.
  2. Zastępuje metodę onGenericMotionEvent() aktywności, aby przekazywać zdarzenia ruchu do wzorca do wykrywania gestów Metoda onMotionEvent().

Gdy wystąpi zdarzenie ruchu, system przekazuje je do wykrywania gestów. Jeśli zostanie rozpoznany, detektor gestów powiadomi odpowiedniego detektora, który ma przetworzyć do zdarzenia.

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

Wykrywanie gestów na poziomie widoku

Wykrywanie gestów na poziomie widoku jest odpowiednie, gdy robić różne rzeczy w zależności od tego, który widok jest zaznaczony.

Ten przykład:

  1. Tworzy widok niestandardowy, który zastępuje dispatchGenericFocusedEvent() . Gdy wystąpi zdarzenie ruchu, ta metoda przekazuje je do wykrywania gestów.
  2. Deklaruje, że widok można zaznaczyć, tak aby wykrywał zdarzenia, gdy jest zaznaczony.
  3. Tworzy GestureDetector, który implementuje do przetwarzania rozpoznanych gestów.

Gdy wykryje ruch przy włączonym widoku, wywoła odpowiedni detektor.

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