本文共 2531 字,大约阅读时间需要 8 分钟。
在应用开发当中,有的时候需要捕捉按键的长按事件,从android2.0开始,activity当中就包含public 方法boolean onKeyLongPress(int keyCode, KeyEvent event);按照正常的开发流程,为了响应onKeyLongPress事件,我们需要重载onKeyLongPress()方法,测试发现onKeyLongPress并不能被正常的调用,为何?
经过查看android api才发现,为了能让系统调用onKeyLongPress方法,我们必须要在onKeyDown方法中调用event.startTracking()方法并返回true才可以。
接下来,我们就可以添加长按事件的业务代码了。
获取长按按键响应
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;//是否长按
public boolean onKeyLongPress(int keyCode, KeyEvent event) { // TODO Auto-generated method stub lockLongPressKey = true; return super.onKeyLongPress(keyCode, event); }
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事件响应会同时起作用。
转载地址:http://hfici.baihongyu.com/