1,增加物理按键:
请参考:https://blog.csdn.net/lxp_p666/article/details/121342435
2,KeyEvent.java里面配置是否为系统按键和可以唤醒按键:
isSystem()
isWakeKey()
3,重复按键的产生:在用户持续按下一个按键到抬起之间,应用程序能够收到多个onKeyDown时间,默认间隔500ms,并且getReaptCount的返回值会不断累加,并且当且仅当第二次调用KeyEvent.isLongPress返回true
inputDispatcher.cpp
struct InputDispatcherConfiguration {
// The key repeat initial timeout.
nsecs_t keyRepeatTimeout;
// The key repeat inter-key delay.
nsecs_t keyRepeatDelay;
InputDispatcherConfiguration() :
keyRepeatTimeout(500 * 1000000LL), //500ms repeat一次
keyRepeatDelay(50 * 1000000LL) { }
};
4,keyevent.java中调用这些回调:onKeyDown,onKeyUp,onKeyLongPress
5,在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;
}
onKeyLongPress:
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);
}
onKeyUp:
if (keyCode == KeyEvent.KEYCODE_ENTER){
if (isLongPress){
isLongPress = false;
return true;
}
Toast.makeText(this, "key抬起", Toast.LENGTH_SHORT).show();
}
6,那如果不用onKeyLongPress,在onKeyDown就不调用event.startTracking(),用repeate的次数来判断长按多长时间做不同的事务处理:
onKeyDown:
if (keyCode == KeyEvent.KEYCODE_ENTER) {
if (event.getRepeatCount() == 0) {
Toast.makeText(this, "key单击", Toast.LENGTH_SHORT).show();
}
else if(event.getRepeatCount() == 1)//长按了1s
{
//长按1s,请处理
}
else if(event.getRepeatCount() == 3)//长按了2s
{
//长按2s,请处理
}
return true;
}