2014-03-06 4 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; 
      } 

불행히도 그것은 작동하지 않습니다 (실행되지 않습니다). 내가 그것을 아주 깊이 분석했을 때 (debug, currentTime과 lastVolumeUpPressingTime의 차이점을 보여주는 토스트 추가) 나는 아주 놀라운 것을 발견했다. 볼륨 버튼을 아주 빨리 누르고 눌렀다가 나는 이전과 다른 점이 있습니다. 100 밀리 초. 그러나 내가 그것을 누르고 꽤 오래 전에 그것을 지킬 때. 2 초, 나는 차이를 얻는다. 20 밀리 초.

무엇인가 잘못되었지만 왜 ??????

답변

1

어떤 이유에서든 onKeyUp 및 onKeyDown 대신 dispatchKeyEvent 메소드에 코드를 삽입해야했지만 볼륨 버튼을 누르고 있으면 키 작동 중지 이벤트가 반복적으로 발생하므로 시간을 재설정해야합니다. onKeyUp에서. 잘하면 내 코드에서 아이디어를 얻을 수 있기를 바랍니다. 난 단지가 제로의 경우 lastVolumeUpPressingDown 설정과 키 업 이벤트가 발생하면 0으로 설정하고있어 어떻게

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

알 수 있습니다.