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; 

    } 

}); 
相关问题