在做Android TV項(xiàng)目的過程中轩性,需要識(shí)別遙控器長按声登、短按來做不同的操作。
在網(wǎng)上查找,一般如下(傳送門):
在Android中已經(jīng)有了長按與短按的識(shí)別悯嗓,只是長按識(shí)別的時(shí)間比較短 件舵,大概在1s以上就認(rèn)為是長按了。主要的思路是設(shè)置一個(gè)標(biāo)志位脯厨,利用事件相應(yīng)次數(shù)函數(shù)event.getRepeatCount()來設(shè)置標(biāo)志位铅祸。主要用的函數(shù)是按鍵響應(yīng)的三個(gè)函數(shù) onKeyLongPress,onKeyDown和onKeyUp合武,具體代碼如下:
private boolean shortPress = false;
@Override
public boolean onKeyLongPress(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
shortPress = false;
//長按要執(zhí)行的代碼
return true;
}
return false;
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
if(event.getAction() == KeyEvent.ACTION_DOWN){
event.startTracking(); //只有執(zhí)行了這行代碼才會(huì)調(diào)用onKeyLongPress
if(event.getRepeatCount() == 0){
shortPress = true;
}
return true;
}
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
if(shortPress){
//短按要執(zhí)行的代碼
}
shortPress = false;
return true;
}
return super.onKeyUp(keyCode, event);
}
按照上述方法临梗,需要在onKeyUp中處理短按鍵(一般onKeyDown時(shí)就處理了),但是由于我在包含F(xiàn)ragment的activity中稼跳,處理邏輯不在activity內(nèi)盟庞,且Fragment沒有 onKeyLongPress,onKeyDown和onKeyUp等函數(shù)汤善,很難實(shí)現(xiàn)對(duì)Fragment中具體焦點(diǎn)的處理什猖,所以此方法暫時(shí)行不通。
經(jīng)過摸索萎津,發(fā)現(xiàn)不需要使用onKeyLongPress卸伞,直接在onKeyDown中調(diào)用event.getRepeatCount()判斷是否大于0,如果大于0锉屈,則認(rèn)為是長按鍵荤傲,記錄標(biāo)志,然后再onKeyUp中處理長按鍵即可颈渊,(長按按鍵鍵時(shí)第1次onKeydown 500ms遂黍,第2次500ms,第3次及之后沒50ms發(fā)送一次onKeydown):
代碼如下:
···
private boolean isLongPressKey;
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_UP:
if (event.getRepeatCount() != 0) {
Log.i(TAG, "onKeyDown: long press key");
isLongPressKey = true;
return true;
}
break;
default:
break;
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_UP:
if (isLongPressKey) {
Log.i(TAG, "onKeyUp: long");
// 長按鍵的處理邏輯
isLongPressKey = false;
return true;
}
break;
default:
break;
}
return super.onKeyUp(keyCode, event);
}
···
這樣做了之后俊嗽,有一個(gè)問題雾家,長按必須放開后,才響應(yīng)動(dòng)作绍豁,這樣在體驗(yàn)上不是很好芯咧,但目前未想到解決辦法,待后續(xù)研究竹揍。