我想在用户按下音量增大按钮并释放它之间消耗时间(例如,如果用户按下音量增大按钮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毫秒。
出了点问题,但为什么??????
答案 0 :(得分: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(如果它为零),并且当关键事件发生时将其设置为零。