世界杯主办国

前言:最近在做一个关于硬按键的处理,大多数都可以转成Android的keycode,其中一个功能就是要针对按键的长按和短按来做出相应的动作,包括长按的时长不同,相应的处理也不同。下面是我总结的关于识别Android按键的短按和长按以及长按时长的判断。

在KeyEvent中,有一个callback接口,里面有KeyDown(),onKeyUp(),onKeyLongPress()几个函数,我们主要通过实现这几个函数来实现我们的功能。

代码语言:javascript代码运行次数:0运行复制boolean onKeyDown(int keyCode, KeyEvent event){

if (keyCode == KeyEvent.KEYCODE_ENTER) {

if (event.getRepeatCount() == 0) {

event.startTracking();

isLongPress = false;

}

else {

isLongPress = true;

}

return true;

}

}代码语言:javascript代码运行次数:0运行复制 public boolean onKeyLongPress(int keyCode, KeyEvent event) {

if (keyCode == KeyEvent.KEYCODE_ENTER) {

isLongPress = true;

Toast.makeText(this, "长按", Toast.LENGTH_SHORT).show();

return true;

}

}

}代码语言:javascript代码运行次数:0运行复制public boolean onKeyUp(int keyCode, KeyEvent event) {

if (keyCode == KeyEvent.KEYCODE_ENTER){

if (isLongPress){

isLongPress = false;

return true;

}

}但是这种方法只适合在Activity中判断。但是我的应用是一个后台应用,

下面这个是参考CarInputService.java中的函数写的一个判断硬按键长按短按已经按了几秒的一个方法。这里面定义了按键按下去和弹上来的事件,然后在按下去的时候和弹回来时分别计时,最后算出此次按键的时间,然后多久算长按有自己决定。具体代码看下面:

代码语言:javascript代码运行次数:0运行复制//定义了一个类,专门来处理按键时长

private static final class KeyPressTimer {

private static final long LONG_PRESS_TIME_MS = 1000;

private static final long LONG_PRESS_TIME_MS_3 = 3000;

private static final long LONG_PRESS_TIME_MS_10 = 10000;

private boolean mDown = false; //判断按键状态

private long mDuration = -1; //长按时长

//在KeyEvent状态变为down时调用,

synchronized void keyDown() {

mDown = true;

mDuration = SystemClock.elapsedRealtime();

}

//在KeyEvent状态变为up时调用,然后计算

synchronized void keyUp() {

if (!mDown) {

throw new IllegalStateException("key can't go up without being down");

}

mDuration = SystemClock.elapsedRealtime() - mDuration;

mDown = false;

}

//判断是否是长按

synchronized boolean isLongPress() {

if (mDown) {

throw new IllegalStateException("can't query press length during key down");

}

return mDuration >= LONG_PRESS_TIME_MS;

}

//判断是否长按三面

synchronized boolean isThreePress() {

if (mDown) {

throw new IllegalStateException("can't query press length during key down");

}

return (mDuration >= LONG_PRESS_TIME_MS_3) && (mDuration <= LONG_PRESS_TIME_MS_10);

}

//判断是否长按十秒

synchronized boolean isTenPress() {

if (mDown) {

throw new IllegalStateException("can't query press length during key down");

}

return mDuration >= LONG_PRESS_TIME_MS_10;

}

}针对每个需要区分长按短按的按键都需要写一个处理方法,在这个方法里调用之前写的EnterPressTimer里的方法,来判断他是长按还是短按,然后进行相应的处理。

代码语言:javascript代码运行次数:0运行复制private void handleEnterKey(KeyEvent event) {

int action = event.getAction();

if (action == KeyEvent.ACTION_DOWN) {

mEnterPressTimer.keyDown();

} else if (action == KeyEvent.ACTION_UP) {

mEnterPressTimer.keyUp();

if (mEnterPressTimer.isTenPress()) {

} else if (mEnterPressTimer.isThreePress()) {

} else {

}

}

}