Жест касания Google Glass GDK

С GDK и образцом кода, предоставленным Google, жест 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;
}

}

Я что-то пропустил здесь или это ошибка?


person Patrick    schedule 22.11.2013    source источник
comment
Код, который вы предоставили, печатает TAP для меня, когда я кратко нажимаю на сенсорную панель. Вы хотите сказать, что когда вы делаете быстрое нажатие на долю секунды, оно все еще печатает LONG_PRESS?   -  person Tony Allevato    schedule 22.11.2013
comment
да. пытался снова и снова как можно быстрее и никогда не получал TAP   -  person Patrick    schedule 22.11.2013
comment
По-видимому, у вас нет проблем с поведением касания в других частях Glass. Из любопытства, можете ли вы попробовать другие жесты, чтобы увидеть, работают ли они должным образом, например TWO_TAP и THREE_TAP или некоторые свайпы?   -  person Tony Allevato    schedule 22.11.2013
comment
Да, TWO_TAP и THREE_TAP работают корректно. Заметил, что есть задержка после тапа, как будто он ждет столько же времени, сколько и долгое нажатие.   -  person Patrick    schedule 22.11.2013
comment
Можете ли вы распечатать необработанные события MotionEvents, чтобы узнать, отправляется ли когда-либо ACTION_UP при нажатии? Если ACTION_UP никогда не приходит, резервным вариантом является запуск жеста LONG_PRESS по истечении времени длительного нажатия.   -  person Tony Allevato    schedule 23.11.2013
comment
Да скоро сделаю. Я отключился на день.   -  person Patrick    schedule 23.11.2013
comment
убедитесь, что это ваш импорт. импортировать com.google.android.glass.touchpad.Gesture; импортировать com.google.android.glass.touchpad.GestureDetector;   -  person SemaphoreMetaphor    schedule 25.11.2013
comment
Да, они такие же, как в коде выше   -  person Patrick    schedule 26.11.2013
comment
Есть новости по этому поводу? У меня те же проблемы.   -  person jonstaff    schedule 30.01.2014
comment
См. code.google.com/p/google-glass. -api/issues/detail?id=401   -  person Sean Barbeau    schedule 23.04.2014
comment
В основном это происходит в XE20.1.   -  person Siddiq Abu Bakkar    schedule 23.02.2015
comment
мы сейчас на XE22, и у меня все еще есть эта проблема. Кто-нибудь знает, есть ли надежное обходное решение?   -  person NoSixties    schedule 07.05.2015


Ответы (3)


Если вы хотите зафиксировать только события касания для пользовательского интерфейса (без использования GestureDetector и всего прочего), в сенсорной панели Glass касания регистрируются как щелчок по центру крестовины, поэтому вы можете просто перехватывать нажатия клавиш KEYCODE_DPAD_CENTER.

Попробуй это:

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

    return false;
}
person Victor KP    schedule 27.04.2014
comment
Это, безусловно, самый быстрый и простой подход. К сожалению, этот метод не обрабатывает команды Swipe Left и Swipe Right, которые, как я читал, должны быть зарегистрированы в KEYCODE_TAB с логическим флагом в KeyEvent.isShiftPressed(). - person Stephen Tetreault; 07.11.2014
comment
Я думал, что они просто сопоставляются с KEYCODE_DPAD_LEFT и KEYCODE_DPAD_RIGHT? Возможно, я ошибаюсь. - person Victor KP; 07.11.2014
comment
Я тоже пробовал их, и, к сожалению, это не сработало. В конце концов, это спорный вопрос, потому что я только что пошел по маршруту GestureDetector. - person Stephen Tetreault; 08.11.2014

У меня была та же проблема, что и у вас, и мой ответ может быть странным, но я избегал этого, используя переключатель вместо структуры 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;
}
person Titogelo    schedule 04.12.2013

Копирование и вставка кода GestureDetector из GDK и его изменение — это все, что вам нужно сделать. Если он работает для двойного нажатия, я подозреваю, что у вас может быть аппаратная проблема со Glass.

Вы пытались сделать Toast для Gesture.TAP? Возможно, TAP и LONG PRESS — это одно и то же?

Код ниже вызовет generateCard(), когда вы нажмете 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;
        }
person CodyEngel    schedule 26.11.2013