关于处理按键长按不用onKeyLongPress的另一种解决方案

2017-11-15 11:32:12来源:oschina作者:明月春秋人点击

分享

近期项目中需要处理按键长按事件,所以使用onKeyLongPress()进行了处理,但同时自己也发现了另一种处理长按的方式。首先来介绍一下使用onKeyLongPress()的相关方法。


一、onKeyLongPress使用


1.在onKeyDown()方法中,使用event.startTracking() 使用onKeyLongPress必须使用event.startTracking() 先定义一个布尔值,表示是否长按


private boolean isLongPress = false;

然后在onKeyDown()方法中


if (keyCode == KeyEvent.KEYCODE_ENTER) {
if (event.getRepeatCount() == 0) {
event.startTracking();
isLongPress = false;
Toast.makeText(this, "key单击", Toast.LENGTH_SHORT).show();
}
else {
isLongPress = true;
}
return true;
}

2.在onKeyLongPress()中写自己需要的代码


@Override
public boolean onKeyLongPress(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_ENTER) {
isLongPress = true;
Toast.makeText(this, "长按", Toast.LENGTH_SHORT).show();
return true;
}
return super.onKeyLongPress(keyCode, event);
}

3.在onKeyUp()方法中对冲突进行处理


if (keyCode == KeyEvent.KEYCODE_ENTER){
if (isLongPress){
isLongPress = false;
return true;
}
Toast.makeText(this, "key抬起", Toast.LENGTH_SHORT).show();
}

不解决冲突的话,会让onKeyLongPress()和onKeyUp()都响应。


二、不用onKeyLongPress()的方法


这种方法是自己想出来的另一种方法,如有雷同,纯属巧合。 1.首先定义一个long值,记录按键抬起时的时间,因为在测试中发现,onKeyDown事件在长按过程中是在不断执行的,所以event.getRepeatCount()才能不断更新记录,但是onKeyUp中的event.getRepeatCount()在长按过程中不会有任何变化,因为只在长按最后抬起时才触发一次,所以每次抬起时打印出来的都是0,所以我们在onKeyUp中判断long值的时间。


private long longTime = 0;

2.接下来在onKeyDown()中判断更新时间


if (keyCode == KeyEvent.KEYCODE_ENTER){
if (event.getRepeatCount() == 0){
longTime = System.currentTimeMillis();
}
return true;
}

前面说过的在onKeyDown()中长按时event.getRepeatCount()会一直更新,所以要判断只在按下来的第一次时更新时间。


3.接下来在onKeyUp()中判断执行自己的代码 当抬起时的时间大于自己设置的时间后,就可以去执行自己想要执行的长按事件了。


@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
Log.d("抬起", event.getRepeatCount()+" " + (System.currentTimeMillis() - longTime));
if (keyCode == KeyEvent.KEYCODE_ENTER){
//毫秒数可以自己指定
if (System.currentTimeMillis() - longTime < 500){
Toast.makeText(this, "key抬起", Toast.LENGTH_SHORT).show();
return true;
}
else {
Toast.makeText(this, "key终于", Toast.LENGTH_SHORT).show();
}
}
return super.onKeyUp(keyCode, event);
}

三、总结


上面两种方法都可以实现处理按键长按的效果,但有所区别,第一种方法,系统会判断在长按一定时间后,就直接执行你想要执行的长按代码,即使你还没有从按键上抬起松开;第二种方法,只有在你抬起松开按键后,才会去根据你指定的毫秒数来判断,是否执行长按方法。两种方法具体怎么使用,大家可以根据自己的情况自行判断,谢谢观赏。

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台