2013-11-22 4 views
5

Google에서 제공하는 GDK 및 샘플 코드를 사용하면 TAP 제스처가 TAP으로 인식되지 않습니다. 매번 LONG_PRESS로 반환됩니다.Google Glass GDK 탭 제스처

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

가}

내가 여기서 뭔가를 놓치고 또는이 버그가 : 아래 코드는?

+0

내가 터치 패드를 짧게 누를 때 당신이 나를 위해 인쇄 "TAP"을 제공 한 코드를. 빠른 초당 탭을 할 때 여전히 "LONG_PRESS"가 인쇄되고 있다고 말하는 것입니까? –

+0

예. 가능한 한 빨리 반복적으로 시도하고 "탭"을 결코 얻지 못했습니다. – Patrick

+0

Glass의 다른 부분에서 탭 동작에 문제가 없다고 가정합니다. 호기심에서 TWO_TAP, THREE_TAP 또는 일부 스 와이프와 같이 예상대로 작동하는지 다른 동작을 시도 할 수 있습니까? –

답변

0

GestureDetector 코드를 GDK에서 복사하여 붙여 넣은 다음 수정하면됩니다. 더블 탭으로 작동하는 경우 Glass에 하드웨어 문제가있을 수 있습니다.

제스처 용 토스트를 시도해 보셨습니까? 아마도 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; 
     } 
1

나는 당신과 나의 대답이 이상 할 수있는 것과 같은 문제가 있었지만 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; 
} 
2

만 (GestureDetector 모든 것을 사용하지 않고)는 UI에 대한 탭 이벤트를 캡처하고자하는 경우에는, 유리에 터치 패드 탭은, 센터는 D 패드로 클릭하여 등록 단순히 KEYCODE_DPAD_CENTER 키를 요격 할 수 있도록 프레스.

이 시도 :

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

    return false; 
} 
+0

이것은 가장 빠르고 가장 간단한 방법입니다. 슬프게도,이 메서드는 내가 읽은 스 와이프 왼쪽 및 스 와이프 오른쪽 명령을 KeyEvent.isShiftPressed()에 부울 플래그가있는 KEYCODE_TAB 아래에 등록해야합니다. – SMT

+0

KEYCODE_DPAD_LEFT 및 KEYCODE_DPAD_RIGHT에 매핑됩니다. 아마 내가 틀렸어. –

+0

나는 그것들을 또한 시험해 보았다. 그리고 슬프게도 그것은 효과가 없었다. 결국 나는 GestureDetector 경로를 갔기 때문에 의문의 대상이됩니다. – SMT

관련 문제