關於處理按鍵長按不用onKeyLongPress的另一種解決方案

明月春秋發表於2017-11-12

近期專案中需要處理按鍵長按事件,所以使用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);
    }複製程式碼

三、總結

上面兩種方法都可以實現處理按鍵長按的效果,但有所區別,第一種方法,系統會判斷在長按一定時間後,就直接執行你想要執行的長按程式碼,即使你還沒有從按鍵上抬起鬆開;第二種方法,只有在你抬起鬆開按鍵後,才會去根據你指定的毫秒數來判斷,是否執行長按方法。兩種方法具體怎麼使用,大家可以根據自己的情況自行判斷,謝謝觀賞。

相關文章