在Android中按下状态时如何让按钮重复执行?

时间:2013-09-23 15:54:21

标签: android button ontouchevent

我想要一个按下按钮时重复执行方法的按钮。一旦它被释放,它应该停止执行该方法。

示例:用户按住按钮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无法正常工作,而且我不知道如何按下按钮的时间。也许与事件?有什么想法吗?

3 个答案:

答案 0 :(得分:1)

使用RunnableHandler定期运行您的方法.-

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。您也可以使用倒计时器。

同时检查此

Android Thread for a timer