2014-03-06 58 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为零,并且在发生按键事件时将其设置为零。

相关问题