Kliknięcia

Nieprzetworzone dane z touchpada Glass możesz uzyskać za pomocą pakietu Android SDK.

GDK udostępnia jednak czujnik gestów, który automatycznie wykrywa typowe gesty w Google Glass, w tym klikanie, przesuwanie i przewijanie.

Ponadto proste gesty są domyślnie przekształcane w zdarzenia pada kierunkowego, aby można je było łatwo przetwarzać bez używania wykrywacza gestów.

Wykrywanie gestów jako zdarzeń pada kierunkowego

Domyślnie system Glass konwertuje proste gesty na zdarzenia na klawiaturze pada kierunkowego. Dzięki temu możesz nasłuchiwać zdarzeń onKeyDown() i onKeyUp() związanych z aktywnościami lub wyświetleniami, aby przetwarzać te gesty jako przyciski na padzie kierunkowym:

Ten fragment kodu jest wykrywany, gdy użytkownik kliknie touchpada:

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

Metoda wykrywania kliknięć w poszczególnych widokach to implementacja OnClickListener w tym widoku. Gdy użytkownik kliknie touchpad (po kliknięciu przycisku środkowego pada kierunkowego), na którym widok jest aktywny, widok może obsługiwać zdarzenie za pomocą 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ą funkcji wykrywania gestów

Detektory gestów pozwalają wykrywać proste gesty oraz bardziej złożone, np. zawierające wiele palców lub przewijanie. Złożone gesty nie mają odpowiadającego mu klawisza pada kierunkowego.

Wykrywacz gestów Udostępnia interfejsy detektorów, które możesz wdrożyć, aby otrzymywać powiadomienia o geście.

Wykrywanie gestów na poziomie aktywności

Wykrywanie gestów na poziomie aktywności jest odpowiednie, gdy nie masz znaczenia, który element interfejsu jest używany. Jeśli na przykład chcesz wyświetlić menu po dotknięciu touchpada, niezależnie od tego, na czym się skupiasz, musisz obsługiwać MotionEvent wewnątrz aktywności.

Ten przykład:

  1. Tworzy element GestureDetector, który implementuje detektory przetwarzające rozpoznawane gesty.
  2. Zastępuje metodę onGenericMotionEvent() aktywności, aby przekazać zdarzenia ruchu do metody wzorca onMotionEvent().

Gdy wystąpi zdarzenie ruchu, system przekazuje je do wzorca do wykrywania gestów. Jeśli go nie rozpozna, wykrywa gest za pomocą odpowiedniego gestu, aby przetworzyć zdarzenie.

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 danych

Wykrywanie gestów na poziomie widoku jest przydatne, jeśli chcesz wykonywać różne działania w zależności od tego, jaki widok jest aktywny.

Ten przykład:

  1. Tworzy widok niestandardowy, który zastępuje metodę dispatchGenericFocusedEvent(). Po wystąpieniu zdarzenia ruchu ta metoda przekazuje zdarzenie ruchu do czujnika gestów.
  2. Określa widok jako dostępny do wykrywania, dzięki czemu wykrywa zdarzenia, gdy jest aktywny.
  3. Tworzy element GestureDetector, który implementuje odbiorniki do przetwarzania rozpoznawanych gestów.

Gdy wykrywacz gestów wykryje ruch, podczas gdy widok jest aktywny, wykrywa go.

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