5

使用 Google 提供的 GDK 和示例代码,TAP 手势不会被识别为 TAP。每次都返回为 LONG_PRESS。下面是代码:

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

}

我在这里遗漏了什么还是这是一个错误?

4

3 回答 3

2

如果您只想捕获 UI 的点击事件(不使用 GestureDetector 和所有内容),在 Glass 触摸板中,点击被注册为中心单击 d-pad,因此您可以简单地拦截 KEYCODE_DPAD_CENTER 按键。

尝试这个:

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

    return false;
}
于 2014-04-27T02:44:59.443 回答
1

我和你有同样的问题,我的回答可能很奇怪,但我使用 switch 而不是 if else 结构来避免它。此外,使用此新代码,您将能够捕获其余的手势。

我希望它也能帮助你。

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;
}
于 2013-12-04T17:37:12.913 回答
0

您只需从 GDK 复制和粘贴 GestureDetector 代码并进行修改即可。如果它适用于双击,那么我怀疑您的 Glass 可能存在硬件问题。

你试过为 Gesture.TAP 做 Toast 吗?也许 TAP 和 LONG PRESS 是一样的?

当您点击 Glass 时,下面的代码将调用 generateCard()。

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;
        }
于 2013-11-26T07:11:49.850 回答