未检测到KeyEvent.KEYCODE_DPAD_CENTER

时间:2014-12-01 09:56:22

标签: java android google-glass google-gdk

我关注的是谷歌 Touch Gestures有关检测D-pad键事件的指南,但它们似乎无法正常工作。

以下是我的代码的一部分:

    public final class ResultActivity extends Activity implements AsyncResponse{

    [...] 

    @Override
    public boolean onKeyUp(int keycode, KeyEvent event){
       if(keycode == KeyEvent.KEYCODE_DPAD_DOWN){
        //this doesnt get detected
        return true;
       }
       if(keycode == 4){
        //this gets detected
        return true;
       }
       return false;
    }//end onKeyUp

    }//end activity

是的,我也尝试了 onKeyDown

可能导致此问题的原因是什么?

2 个答案:

答案 0 :(得分:2)

这并不能完全回答你的问题,但我认为这是一个很好的建议。当我试图以这种方式检测keyevent时,我遇到了同样的问题。我只能正确注册两个事件。在搞砸了几天之后,我决定寻找其他选择,然后来到GestureDetector,尝试过它,它完美地运作了。您可以找到GestureDetector的{​​{3}}。我也会自己给你一些代码来帮忙。

这是我在代码中使用GestureDetector的方式。在最顶层,我宣布私有GestureDetector

private GestureDetector gestureDetector;

然后,在onCreate()方法中,我调用了一个创建GestureDetector的方法(没有理由这样做而只是在onCreate()方法中创建它 - 它只是看起来更干净,更有条理):

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    gestureDetector = createGestureDetector(this);
}

createGestureDetector()方法如下所示:

private GestureDetector createGestureDetector(Context context) {
    GestureDetector gestureDetectorTemp = new GestureDetector(context, new GestureDetector.OnGestureListener() {
                        //we are creating our gesture detector here
        @Override
        public boolean onDown(MotionEvent motionEvent) {
            return false;
        }

        @Override
        public void onShowPress(MotionEvent motionEvent) {
        }

        @Override
        public boolean onSingleTapUp(MotionEvent motionEvent) {  //onTap
            AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
            am.playSoundEffect(SoundEffectConstants.CLICK);   //if we tap once, play a click sound 
            return false;
        }
        @Override
        public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent2, float distanceX, float distanceY) {
            return false; //this is the wrong kind of scroll
        }
        @Override
        public void onLongPress(MotionEvent motionEvent) {
        }

        @Override
        public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent2, float v, float v2) { //fling = a single slide
            int dx = (int) (motionEvent2.getX() - motionEvent.getX());   //figure out the distance moved horizontally
            int dy = (int) (motionEvent2.getY() - motionEvent.getY());   //figure out the distance moved vertically

            //if dx > 0, moved forward, if dx < 0, moved backward
            //if dy > 0, moved up, if dy < 0, moved down

            return true;
        }
    });

    return gestureDetectorTemp;
}

@Override
public boolean onGenericMotionEvent(MotionEvent event) {
    if (gestureDetector != null) {
        return gestureDetector.onTouchEvent(event);
    }
    return false;
}

你必须确保在那里包含我所拥有的onGenericMotionEvent()方法。这就是确保每次发生运动事件时都会通知您GestureDetector的原因。

最后要注意的是GestureDetector中的返回 - 您返回true以使用该事件,或者返回false以不使用它。换句话说,如果您想覆盖默认情况下发生的事情,例如在向下滑动时关闭应用,只需进入onFling()事件,如果dy&lt; 0,返回true。这会消耗该事件,并且不会将其发送到其他默认方法以进行操作。

答案 1 :(得分:1)

在您的代码中,您有KeyEvent.KEYCODE_DPAD_DOWN,但您的主题显示您在KeyEvent.KEYCODE_DPAD_CENTER之后(这是为了点击)。

我不认为DPAD_DOWN会映射到玻璃上,因为向下滑动会映射到KEYCODE_BACK

因此,如果您尝试检测点按使用KeyEvent.KEYCODE_DPAD_CENTER,或者如果您在向下滑动后使用KeyEvent.KEYCODE_BACK