我想要一个按下按钮时重复执行方法的按钮。一旦它被释放,它应该停止执行该方法。
示例:用户按住按钮5秒钟。然后该方法应在这5秒内反复执行。另外,重复调用的方法需要知道到目前为止按下按钮的时间。
这是我到目前为止所拥有的。我使用的是onTouchListener
:
myButton.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
myButton.setText("Pressed!");
while(myButton.isPressed()) {
doSomething(event);
}
break;
case MotionEvent.ACTION_UP:
myButton.setText("Press me!");
}
return false;
};
private void doSomething(MotionEvent event) {
// Do some calculation with the time the button is pressed so far
}
});
我的问题是while-loop
无法正常工作,而且我不知道如何按下按钮的时间。也许与事件?有什么想法吗?
答案 0 :(得分:1)
使用Runnable
和Handler
定期运行您的方法.-
private final int INTERVAL = 100;
private Handler handler = new Handler();
private Runnable autoRotateRunnable = new Runnable() {
@Override
public void run() {
periodicMethod();
schedulePeriodicMethod();
}
};
public void schedulePeriodicMethod() {
handler.postDelayed(runnable, INTERVAL);
}
public void stopPeriodicMethod() {
handler.removeCallbacks(runnable);
}
您的切换方法如下所示.-
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
myButton.setText("Pressed!");
schedulePeriodicMethod();
break;
case MotionEvent.ACTION_UP:
myButton.setText("Press me!");
stopPeriodicMethod();
}
}
关于按下和按下之间的时间,您可以将当前Date
存储在ACTION_DOWN
上,并将其与Date
上的ACTION_UP
进行比较。
答案 1 :(得分:1)
试试这个
myButton.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction()== MotionEvent.ACTION_MOVE)
{
myButton.setText("Pressed!");
doSomething(event);
return true;
}
if(event.getAction()== MotionEvent.ACTION_UP)
{
myButton.setText("Press me!");
return false;
}
return true;
}
private void doSomething(MotionEvent event) {
// Do some calculation with the time the button is pressed so far
}
});
答案 2 :(得分:0)
在按钮上触摸侦听器
Handler m_handler;
Runnable m_handlerTask ;
m_handler = new Handler();
m_handlerTask = new Runnable()
{
@Override
public void run() {
// do something
m_handler.postDelayed(m_handlerTask, 1000); // 1 second repeat
}
};
m_handlerTask.run();
停止运行
m_handler.removeCallbacks(m_handlerTask);
您也可以使用计时器。但是计时器在不同的线程上运行,因此如果使用计时器,请使用runOnUiThread
更新ui。您也可以使用倒计时器。
同时检查此