0

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

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

4

3 回答 3

1

使用 aRunnable和 aHandler定期运行您的方法。-

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 方法看起来像这样。-

switch(event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        myButton.setText("Pressed!");
        schedulePeriodicMethod();
    break;  
    case MotionEvent.ACTION_UP:
        myButton.setText("Press me!");
        stopPeriodicMethod();
    }
}

至于按下和按下之间的时间,您可以存储当前Date的 on ACTION_DOWN,并与Dateon进行比较ACTION_UP

于 2013-09-23T16:05:43.157 回答
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
      }
  });
于 2013-09-23T19:29:44.977 回答
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 线程

于 2013-09-23T16:07:24.497 回答