博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android添加onKeyLongPress事件
阅读量:4050 次
发布时间:2019-05-25

本文共 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;//是否长按

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

转载地址:http://hfici.baihongyu.com/

你可能感兴趣的文章
Truncate 表之恢复
查看>>
Oracle DG failover 后恢复
查看>>
mysql 主从同步配置
查看>>
为什么很多程序员都选择跳槽?
查看>>
mongdb介绍
查看>>
mongdb在java中的应用
查看>>
区块链技术让Yotta企业云盘为行政事业服务助力
查看>>
Yotta企业云盘更好的为媒体广告业服务
查看>>
Yotta企业云盘助力科技行业创高峰
查看>>
Yotta企业云盘更好地为教育行业服务
查看>>
Yotta企业云盘怎么帮助到能源化工行业
查看>>
企业云盘如何助力商业新发展
查看>>
医疗行业运用企业云盘可以带来什么样的提升
查看>>
媒体广告业如何将内容资产进行高效地综合管理与利用
查看>>
能源化工要怎么管控核心数据
查看>>
媒体广告业如何运用云盘提升效率
查看>>
企业如何运用企业云盘进行数字化转型-实现新发展
查看>>
司法如何运用电子智能化加快现代化建设
查看>>
iSecret 1.1 正在审核中
查看>>
IOS开发的开源库
查看>>