Почему мой таймер обратного отсчета не работает до конца?[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;
}
Другие вопросы по тегам