1. 程式人生 > >關於處理按鍵長按不用onKeyLongPress的另一種解決方案

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

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

三、總結

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