【问题标题】:android onKeyDown onKeyUp measuring timeandroid onKeyDown onKeyUp 测量时间
【发布时间】:2014-03-06 19:58:54
【问题描述】:

我想测量用户按下音量调高按钮并释放它之间的时间(例如,如果用户按住音量调高按钮 2 秒,应用程序会做一些事情,如果 4 秒,应用程序会做一些不同的事情)。

乍一看,这似乎是一件很容易的事情。为了控制我的活动代码中有以下部分:

    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;
            }

不幸的是它不能正常工作(做某事没有执行)。当我对其进行深入分析(调试,添加 toast 显示 currentTime 和 lastVolumeUpPressingTime 之间的差异)时,我发现了非常令人惊讶的事情。如果我很快按下并释放音量按钮,我就会得到 ex。 100 毫秒。但是,当我按下并保持相当长的时间时。 2秒,我得到了差异。 20 毫秒。

出了点问题,为什么??????

【问题讨论】:

    标签: java android android-keypad android-keystore java-time


    【解决方案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 为零时设置它,并在按键事件发生时将其设置为零。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      • 2017-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多