2014-03-06 89 views
0

我想在用戶按下音量增加按鈕之間確定時間並釋放它(例如,如果用戶保持音量增大按鈕按下2秒,應用程序將執行某些操作,如果4秒鐘該應用程序將執行某些操作不同)。android onKeyDown onKeyUp測量時間

乍一看這似乎是很容易的事情。爲了控制,我在我的活動代碼以下部分:

public final static long MINIMUM_VOLUME_UP_PRESSING_TO_ACTIVATE_DEACTIVATE=2000; 

    public final static long MAXIMUMT_VOLUME_UP_PRESSING_TO_ACTIVATE_DEACTIVATE=5000; 

    public boolean onKeyDown (int keyCode, KeyEvent event) { 
       switch (keyCode) { 
        case KeyEvent.KEYCODE_VOLUME_UP: 
        lastVolumeUpPressingDown=System.currentTimeMillis(); 
        return true; 
       } 
       return false; 
      } 

    public boolean onKeyUp(int keyCode, KeyEvent event) { 
       long currentTime = System.currentTimeMillis(); 
       switch (keyCode) { 
        case KeyEvent.KEYCODE_VOLUME_UP: 
        if ((currentTime-lastVolumeUpPressingDown>=MINIMUM_VOLUME_UP_PRESSING_TO_ACTIVATE_DEACTIVATE) && 
       (currentTime-lastVolumeUpPressingDown<=MAXIMUMT_VOLUME_UP_PRESSING_TO_ACTIVATE_DEACTIVATE)) { 
            , 
        do something 
        return true; 
        } 
       return false; 
      } 

遺憾的是它不炒鍋(做某事不執行)。當我深入分析它時(調試,添加顯示當前時間和lastVolumeUpPressingTime之間差異的吐司),我發現了非常令人驚訝的事情。如果我很快地按下並釋放音量按鈕,我可以看到前面的區別。 100毫秒。但是,當我按下並保持很久以前。 2秒,我得到了不同的前。 20毫秒。

有什麼不對,但爲什麼??????

回答

1

由於某些原因,我必須將代碼放入我的dispatchKeyEvent方法中,而不是放在onKeyUp和onKeyDown上,但發生的事情是,按住按鈕時重複觸發按鍵事件,因此您必須重置時間在onKeyUp中。希望你能從我的代碼中獲得想法。

else if(event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP && event.getAction() == KeyEvent.ACTION_DOWN){ 
     if(lastVolumeUpPressingDown == 0){ 
     lastVolumeUpPressingDown=System.currentTimeMillis(); 
     Log.d(LOG_TAG,"Pressing down at " + lastVolumeUpPressingDown); 
     } 
     return true; 
    } 
    else if(event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP && event.getAction() == KeyEvent.ACTION_UP){ 
     long currentTime = System.currentTimeMillis(); 
     Log.d(LOG_TAG,"Releasing at " + currentTime); 
     long diff = currentTime - lastVolumeUpPressingDown; 
     lastVolumeUpPressingDown = 0; 
     Log.d(LOG_TAG,"Button press lasted " + diff + " ms"); 
     if ((diff>=MINIMUM_VOLUME_UP_PRESSING_TO_ACTIVATE_DEACTIVATE) && 
       (diff<=MAXIMUMT_VOLUME_UP_PRESSING_TO_ACTIVATE_DEACTIVATE)) { 
      Log.d(LOG_TAG,"Good enough, I would like to do something"); 
      return true; 
     } 
    } 

請注意,如果我只設置lastVolumeUpPressingDown爲零,並且在發生按鍵事件時將其設置爲零。

相關問題