近期项目中需要处理按键长按事件,所以使用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);
}
三、总结
上面两种方法都可以实现处理按键长按的效果,但有所区别,第一种方法,系统会判断在长按一定时间后,就直接执行你想要执行的长按代码,即使你还没有从按键上抬起松开;第二种方法,只有在你抬起松开按键后,才会去根据你指定的毫秒数来判断,是否执行长按方法。两种方法具体怎么使用,大家可以根据自己的情况自行判断,谢谢观赏。