1

Так что я пытаюсь отобразить на кнопку время, так как пользователь начал нажимать его, вот мой код:Как получить время кнопка нажата в то время как пользователь все еще удерживая в Android

btn.setOnTouchListener(new View.OnTouchListener() { 

     @Override 
     public boolean onTouch(View view, MotionEvent motionEvent) { 

      long eventDuration; 

      switch (motionEvent.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        isDown = true; 
        break; 
       case MotionEvent.ACTION_UP: 
        isDown = false; 
        break; 
       default: 
        break; 
      } 
      eventDuration = motionEvent.getEventTime() - motionEvent.getDownTime(); 
      btn.setText(String.valueOf(eventDuration)); 
      return true; 

     } 

    }); 

Код работает, за исключением того, что значение нажатого времени не обновляется, если пользователь удерживает кнопку и не двигает пальцем, потому что нет действия, такого как «MotionEvent.ACTION_HOLD». Я хочу, чтобы это значение продолжало обновляться, даже если пользователь не двигает пальцем.

Я попытался запустить это метод каждый раз, когда действие является «MotionEvent.ACTION_DOWN»

while(isDown){ 
    eventDuration = motionEvent.getEventTime() - motionEvent.getDownTime(); 
        btn.setText(String.valueOf(eventDuration)); 
    } 

Но не работает цикл, пока не остановится и isDown сохранил свое последнее значение true. Может ли кто-нибудь сказать мне, как я могу заставить его работать? БЛАГОДАРЯ!

ответ

1

Вы можете используйте CountDownTimer здесь, когда пользователь нажимает кнопку, запускает countDownTimer с максимальным пределом очень высокого значения и отменяет его, когда вы получаете action_up в ouTouchListener

int TICK_DURATION = 1000; 
int MAX_LIMIT_IN_MILLISECONDS = Integer.MAX_VALUE; 
CountDownTimer cdt = new CountDownTimer(MAX_LIMIT_IN_MILLISECONDS, TICK_DURATION) { 

    public void onTick(long millisUntilFinished) { 
     mTextField.setText("seconds spent: " + (MAX_LIMIT_IN_MILLISECONDS-millisUntilFinished)/1000); 
     //here you can have your logic to set text to edittext 
    } 

    public void onFinish() { 
     // this will be called when max int value is reached!! depending upon your requirement you can restart countdownTimer here 
    } 

} 

затем начать это в Action_down еще не начал иначе сбросить его

cdt.start(); 

и закончить его в action_down

cdt.cancel(); 
+0

Отличная идея использования countDownTimer. Я попробую поблагодарить вас! –

+0

Это работало PERFRCT! БОЛЬШОЕ СПАСИБО ! –

+0

Рад, что это сработало. :) –

0

Вы должны использовать таймер

private int timeDown; 
private TimerTask timerTask = new TimerTask() { 
    @Override 
    public void run() { 
     //update 
    } 
}; 
private Timer timer; 

Затем в onTouch случае, запустите таймер

btn.setOnTouchListener (новый View.OnTouchListener() {

@Override 
    public boolean onTouch(View view, MotionEvent motionEvent) { 

     long eventDuration; 

     switch (motionEvent.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       isDown = true; 
       if(timer == null){ 
        timer = new Timer(); 
        int updateFrequency = 1000; // every second 
        timeDown = motionEvent.getDownTime(); 
        timer.scheduleAtFixedRate(timerTask, 0, updateFrequency); 
       } 
       break; 
      case MotionEvent.ACTION_UP: 
       isDown = false; 
       timer.cancel(); 
       timer = null; 
       break; 
      default: 
       break; 
     } 
     return true; 

    } 

});