Почему мой таймер обратного отсчета не работает до конца?[Android]
Я делаю подсчет того, как долго кнопка была нажата сразу после ACTION_DOWN, в зависимости от того, как долго она была нажата - я реагирую на нажатие по-разному в ACTION_UP.
Проблема в том, что когда я делаю action_down(нажмите), он не начинает обратный отсчет, а иногда и делает.
Код:
@Override
public boolean onTouch(final View v, final MotionEvent e) {
switch (e.getAction()) {
case MotionEvent.ACTION_DOWN:
still_down = false;
main_timer = new CountDownTimer(500, 4) {
@Override
public void onTick(long millisUntilFinished) {
Log.wtf("x", "timer: " + millisUntilFinished);
if ((int) millisUntilFinished < 100 && e.getAction() == MotionEvent.ACTION_DOWN) {
// above is where i detect that timer does not count down to 0, it stops at 119,107 etc
still_down = true;
}
}
@Override
public void onFinish() {
if (still_down) {
Log.wtf("x", "SHOW THE LARGE CARD!!!!!!!!!!!!!!!!!");
answer.setTextSize(50);
RelativeLayout.LayoutParams x = new RelativeLayout.LayoutParams(350, 500);
x.setMargins(margin_long_press_x1, margin_long_press_y1, 0, 0);
answer.setLayoutParams(x);
answer.requestLayout();
}
}
};
main_timer.start();
break;
case MotionEvent.ACTION_UP:
if (still_down) {
//image becomes small size again
main_timer.cancel();
} else {
action_on_single_tap( e);
}
break;
}
return true;
}
Я ставлю логи в onTick() и вижу, что таймер не всегда отсчитывает до 0.
Есть ли альтернативы подсчету, как долго нажимается кнопка в андроиде? Я не знаю других способов.
2 ответа
Вы были на правильном пути, посмотрите на этот вопрос, он почти идентичен.
Я нашел это наиболее полезным
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction()==MotionEvent.ACTION_DOWN) {
this.start = System.currentTimeMillis();
} else if (event.getaction()==MotionEvent.ACTION_UP) {
this.end = System.currentTimeMillis();
}
}
В onTick
действие, интерпретируемое оператором if, всегда ACTION_DOWN, потому что это тот случай, когда вы его определяете. Вот почему он всегда останавливается около 100 пороговых значений, которые вы установили.
Если вы переместите объявление таймера обратного отсчета из onTouch
обработчик, это помогает увидеть, как они разделены. Попробуй это.
private static final long TIMER_DURATION = 500;
private CountDownTimer countDownTimer = new CountDownTimer(TIMER_DURATION, 4) {
@Override
public void onTick(long millisUntilFinished) {
// Don't need to do anything here
}
@Override
public void onFinish() {
Log.i("TimedTouchActivity", "Countdown timer finished!");
// answer.setTextSize(50);
}
};
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_DOWN) {
Log.i("TimedTouchActivity", "Touch down");
countDownTimer.start();
} else if (action == MotionEvent.ACTION_UP) {
Log.i("TimedTouchActivity", "Touch up");
long eventDuration = event.getEventTime() - event.getDownTime();
if (eventDuration < TIMER_DURATION) {
Log.i("TimedTouchActivity", "Short");
countDownTimer.cancel();
// single click
} else {
Log.i("TimedTouchActivity", "Long");
// answer.setTextSize(20);
}
}
return true;
}