Android获取长按按键响应

原创 2013年12月03日 13:39:26

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事件响应会同时起作用。



相关文章推荐

Android 返回键

@Override public void onBackPressed() { // 本函数在按下back键后被调用,但是如果重写了onKeyDown,则本函数不会被调用 Log.e("on...

Android获取长按按键响应

Android项目中有不少地方需要对按键的长按操作进行 响应;例如长按物理菜单按键/音量上下按键等。 在Activity以及View中均有一个方法onKeyLongPress();但重载该方法之后,...

和菜鸟一起学android4.0.3源码之按键驱动短长按功能

第一:按键ADB调试 1>    adb shell getevent中获取到的屏幕事件的坐标转换    通过使用adb shell getevent,可以得到如下设备操作后的指令,具...

android 中如何监听按键的长按事件

1,key -- 实体按键, 现在手机物理按键越来越少 常见的有 KEYCODE_VOLUME_DOWN/UP KEYCODE_POWER KEYCODE_BACK KEYCODE_HOME KE...

和菜鸟一起学android4.0.3源码之按键驱动短长按功能

一切再次回到原点,一切都又开始了正常的路线,上班,下班。每每一个人回到那小小的屋子,觉得什么也不是。想离开,又不知道要去哪。日子还是一天天过去,地球不因任何人改变它的转速,月亮也不会为了谁而改变她的形...

Android系统:L版本怎样识别耳机按键长按or短按?

L版本accdet驱动已经不再检测耳机按键是短按还是长按,是由上层来做的。 L版本accdet驱动不管耳机按键长按或短按,上报的key都是统一的。 alps\kernel-3.10\dri...
  • lyjIT
  • lyjIT
  • 2017年01月19日 14:34
  • 731

Android用代码模拟系统物理按键长按操作(类似按键精灵)

今天同事的朋友提出一个需求,问能不能帮忙写个程序模拟他手机上长按返回键的操作。因为他手机屏幕部分区域失灵,想启用单手模式来使用手机,但是物理触控按键也失灵了。无法通过长按返回触发单手模式。由于之前没做...

多功能检测按键 单按 长按 多个按键 响应方式

按键有效检测方式:1:单按键响应 2:多按键响应 3:长按单个按键响应 4:长按多个按键响应 5:以上响应的方式都可以选择释放后响应和按下马上响应...

独立按键连按和长按处理技巧.

  • 2012年04月27日 23:25
  • 120KB
  • 下载

非延时按键消抖及长按检测程序

  • 2013年02月09日 22:11
  • 980B
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android获取长按按键响应
举报原因:
原因补充:

(最多只允许输入30个字)