Android實現組合鍵監聽功能

有關組合監聽的思路:兩個鍵的點擊其實是有先後順序的,要先做第一個鍵點擊的記錄,如有時間要求還得記錄時間。

下面是兩個例子的代碼:

例子1:長按音量變大的鍵,再按回退鍵一次,處發要處理的事件。

boolean isKeyvolume=false;

    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        int eventAction = event.getAction();
        int keyCode = event.getKeyCode();
        if (eventAction == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
            isKeyvolume=true;
        }else if(eventAction == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_VOLUME_UP){
            isKeyvolume=false;
        }else if(eventAction == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_BACK){
            if(isKeyvolume){
                Toast.makeText(MainActivity.this,"000",Toast.LENGTH_LONG).show();
                return true;
            }
        }
        return super.dispatchKeyEvent(event);
    }


例子2:長按音量變大的鍵,再長按回退鍵,處發要處理的事件。(長按時這個事件會觸發多次,如果沒有做雙擊退出應用就會出現退出應用的效果)

int mBackKeyAction, mVolumnUpKeyAction;
    long mActionTime;

    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {

        int keyCode = event.getKeyCode();
        int action = event.getAction();

        if (keyCode == KeyEvent.KEYCODE_VOLUME_UP && event.getAction() == KeyEvent.ACTION_DOWN) {
            mVolumnUpKeyAction = KeyEvent.ACTION_DOWN;   //記錄按下狀態
            if (mActionTime == 0) {
                mActionTime = System.currentTimeMillis();
            }
        } else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP && event.getAction() == KeyEvent.ACTION_UP) {
            mVolumnUpKeyAction = KeyEvent.ACTION_UP;    //記錄松下狀態
            mActionTime = 0;
        }else if (keyCode == KeyEvent.KEYCODE_BACK && action == KeyEvent.ACTION_DOWN) {
            mBackKeyAction = KeyEvent.ACTION_DOWN;  //記錄按下狀態
            if (mActionTime == 0) {
                mActionTime = System.currentTimeMillis();
            }
        } else if (keyCode == KeyEvent.KEYCODE_BACK && action == KeyEvent.ACTION_UP) {
            mBackKeyAction = KeyEvent.ACTION_UP;  //記錄松下狀態
            mActionTime = 0;
        }

        //長按,且Back鍵和音量變大鍵沒鬆
        if (isLongPress() && mBackKeyAction == KeyEvent.ACTION_DOWN && mVolumnUpKeyAction == KeyEvent.ACTION_DOWN) {
            //do something
            Toast.makeText(MainActivity.this, "TestTest", Toast.LENGTH_SHORT).show();
            //事件不下發啦
            return true;
        }

        return super.dispatchKeyEvent(event);
    }

    private boolean isLongPress() {
        if (System.currentTimeMillis() - mActionTime > 2000) {
            return true;
        } else {
            return false;
        }
    }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章