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

但沒有工作的while循環沒有停止,isDown保持其最後的值true。任何人都可以告訴我,我怎樣才能得到它的工作?謝謝!

回答

1

你可以在這裏使用CountDownTimer,當用戶按下按鈕時啓動countDownTimer,其最大限制值爲非常高的值,並在ouTouchListener中收到action_up時取消它。

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(); 

,並使用countDownTimer完成它ACTION_DOWN

cdt.cancel(); 
+0

偉大的想法裏面。我會試試謝謝你! –

+0

它工作PERFRCT!非常感謝 ! –

+0

很高興工作。 :) –

0

你需要在你的onTouch事件使用定時器

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

然後,啓動定時器

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; 

    } 

}); 
相關問題