Android获取长按按键响应
Android项目中有不少地方需要对按键的长按操作进行 响应;例如长按物理菜单按键/音量上下按键等。
在Activity以及View中均有一个方法onKeyLongPress();但重载该方法之后,并不能对长按操作进行响应。
onKeyLongPress()方法:
public boolean onKeyLongPress(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
return super.onKeyLongPress(keyCode, event);
}
不能正常响应的原因:
onKeyDown()中没有对短按,长按事件进行识别。如要对长按事件进行响应,要在onKeyDown()中添加如下代码:
if (event.getRepeatCount() == 0) {
event.startTracking();
isLongPressKey = false;
}else{
isLongPressKey = true;
}
onKeyDown()代码示例如下:
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
Log.d(TAG,"---->>onKeyDown():keyCode="+keyCode);
switch(keyCode){
case KeyEvent.KEYCODE_MENU://需要识别长按事件
case KeyEvent.KEYCODE_ENTER:
case KeyEvent.KEYCODE_DPAD_CENTER:
if (event.getRepeatCount() == 0) {//识别长按短按的代码
event.startTracking();
isLongPressKey = false;
}else{
isLongPressKey = true;
}
return true;
case KeyEvent.KEYCODE_VOLUME_UP:
case KeyEvent.KEYCODE_DPAD_UP:
return true;
case KeyEvent.KEYCODE_VOLUME_DOWN:
case KeyEvent.KEYCODE_DPAD_DOWN:
return true;
}
return super.onKeyDown(keyCode, event);
}
要处理onKeyLongPress和onKeyUp的冲突事件
1、添加变量
private boolean lockLongPressKey;//是否长按
2、在onKeyLongPress中
public boolean onKeyLongPress(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
lockLongPressKey = true;
return super.onKeyLongPress(keyCode, event);
}
3、在onKeyUp()中要添加冲突处理,如下:
public boolean onKeyUp(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
Log.d(TAG,"---->> onKeyDown():keyCode="+keyCode);
switch(keyCode){
case KeyEvent.KEYCODE_MENU:
case KeyEvent.KEYCODE_ENTER:
case KeyEvent.KEYCODE_DPAD_CENTER:
if(lockLongPressKey){
lockLongPressKey = false;
return true;
}
return true;
case KeyEvent.KEYCODE_VOLUME_UP:
case KeyEvent.KEYCODE_DPAD_UP:
return true;
case KeyEvent.KEYCODE_VOLUME_DOWN:
case KeyEvent.KEYCODE_DPAD_DOWN:
return true;
}
return super.onKeyUp(keyCode, event);
}
注意问题:
添加长按响应以后要在onKeyUp()中添加长按冲突处理,否则长按事件和UP事件响应会同时起作用。