我关注的是谷歌 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 。
可能导致此问题的原因是什么?
答案 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
。