近期專案中需要處理按鍵長按事件,所以使用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);
}複製程式碼
三、總結
上面兩種方法都可以實現處理按鍵長按的效果,但有所區別,第一種方法,系統會判斷在長按一定時間後,就直接執行你想要執行的長按程式碼,即使你還沒有從按鍵上抬起鬆開;第二種方法,只有在你抬起鬆開按鍵後,才會去根據你指定的毫秒數來判斷,是否執行長按方法。兩種方法具體怎麼使用,大家可以根據自己的情況自行判斷,謝謝觀賞。