5

With GDK and sample code provide by Google the TAP gesture is not being recognized as a TAP. Is returned as LONG_PRESS everytime. Below is the code:

import com.google.android.glass.touchpad.Gesture;
import com.google.android.glass.touchpad.GestureDetector;

public class MainActivity extends Activity {

Logger log = Logger.getLogger("MainActivity");

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) {
            log.info(gesture.name());
            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;
}

}

Am I missing something here or is this a bug?

Patrick Jackson
  • 18,766
  • 22
  • 81
  • 141

3 Answers3

2

If you're only looking to capture tap events for a UI (without using GestureDetector and everything), in Glass touchpad taps are registered as center clicking a d-pad, so you can simply intercept the KEYCODE_DPAD_CENTER key presses.

Try this:

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode == KeyEvent.KEYCODE_DPAD_CENTER){
        // The touchpad was tapped
        return true;
    }

    return false;
}
Victor KP
  • 437
  • 3
  • 10
  • This is for sure the fastest and most simple approach. Sadly though, this method doesn't handle the Swipe Left and Swipe Right commands which I have read should be registered under KEYCODE_TAB with a boolean flag on KeyEvent.isShiftPressed() – Stephen Tetreault Nov 07 '14 at 18:05
  • I thought those just map to KEYCODE_DPAD_LEFT and KEYCODE_DPAD_RIGHT? Perhaps I'm wrong. – Victor KP Nov 07 '14 at 20:53
  • I had tried those as well, and sadly it didn't work. In the end its a moot point because I just went the GestureDetector route. – Stephen Tetreault Nov 07 '14 at 21:00
1

I had the same problem as you and my answer could be strange but I avoided it using a switch instead of the if else structure. Moreover with this new code you will be able to capture the rest of the gestures.

I hope it will help you as well.

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) {
            Log.e(TAG,"gesture = " + gesture);
            switch (gesture) {
                case TAP:
                    Log.e(TAG,"TAP called.");
                    handleGestureTap();
                    break;
                case LONG_PRESS:
                    Log.e(TAG,"LONG_PRESS called.");
                    return true;
                case SWIPE_DOWN:
                    Log.e(TAG,"SWIPE_DOWN called.");
                    return true;
                case SWIPE_LEFT:
                    Log.e(TAG,"SWIPE_LEFT called.");
                    return true;
                case SWIPE_RIGHT:
                    Log.e(TAG,"SWIPE_RIGHT called.");
                    return true;
                case SWIPE_UP:
                    Log.e(TAG,"SWIPE_UP called.");
                    return true;
                case THREE_LONG_PRESS:
                    Log.e(TAG,"THREE_LONG_PRESS called.");
                    return true;
                case THREE_TAP:
                    Log.e(TAG,"THREE_TAP called.");
                    return true;
                case TWO_LONG_PRESS:
                    Log.e(TAG,"TWO_LONG_PRESS called.");
                    return true;
                case TWO_SWIPE_DOWN:
                    Log.e(TAG,"TWO_SWIPE_DOWN called.");
                    return true;
                case TWO_SWIPE_LEFT:
                    Log.e(TAG,"TWO_SWIPE_LEFT called.");
                    return true;
                case TWO_SWIPE_RIGHT:
                    Log.e(TAG,"TWO_SWIPE_RIGHT called.");
                    return true;
                case TWO_SWIPE_UP:
                    Log.e(TAG,"TWO_SWIPE_UP called.");
                    return true;
                case TWO_TAP:
                    Log.e(TAG,"TWO_TAP called.");
                    return true;
            }

            return false;
        }
    });
    gestureDetector.setFingerListener(new com.google.android.glass.touchpad.GestureDetector.FingerListener() {
        @Override
        public void onFingerCountChanged(int previousCount, int currentCount) {
            // do something on finger count changes
            Log.e(TAG,"onFingerCountChanged()");

        }
    });
    gestureDetector.setScrollListener(new com.google.android.glass.touchpad.GestureDetector.ScrollListener() {
        @Override
        public boolean onScroll(float displacement, float delta, float velocity) {
            // do something on scrolling
            Log.e(TAG,"onScroll()");
            return false;
        }
    });
    return gestureDetector;
}
Titogelo
  • 73
  • 7
0

Copying and pasting the GestureDetector code from the GDK and modifying it is all you should need to do. If it's working for double tap then I'd suspect you may have some hardware issue with Glass.

Have you tried doing a Toast for Gesture.TAP? Perhaps TAP and LONG PRESS are the same?

The code below will call generateCard() when you tap Glass.

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) { // On Tap, generate a new number
                        generateCard();
                        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 false;
                }
            });
            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;
        }
CodyEngel
  • 1,501
  • 14
  • 22