2012-04-03 55 views
5

比方說,你有一個TextView,顯示一個數字爲0,你有一個Button。 現在,如果用戶按下按鈕,TextView中的數字將增加一個(我知道該怎麼做),但如果用戶按下按鈕並且不釋放它,那麼TextView中的數字應該增加,這應該只要用戶不釋放Button就可以重複自我。 換句話說:只要用戶按住按鈕,如何一次又一次地增加數字?重複一個動作,只要按下按鈕

回答

6

一般的方法(不是特定於Android)將分別檢測新聞和發佈事件。新聞事件啓動一個週期性任務(RunnableThread),它將添加到計數器(讓我們說每秒5次,或每200毫秒一次)。發佈事件會停止週期性任務。

1
  1. 建立一個View.OnLongClickListener你的按鈕
  2. 給你的活動Runnable,並初始化(但不啓動),當您加載活動
  3. 有OnLongClickListener做更新的定期異步任務文本框並檢查自第一次點擊以來的時間
  4. 創建一個OnTouchListener,當觸摸事件被釋放時暫停Runnable

我知道這是一個粗略的草稿,但是這是可以重複使用和修改一個非常有用的模式,所以它的價值下沉你的爪子把它...

+0

+1這聽起來像我描述更一般的Android特定過程。 – 2012-04-03 22:21:43

2

你需要安排一個當您收到mousePressed事件時發生異步重複事件,並在您收到mouseReleased事件時停止它。

在Java中有很多方法可以處理這個問題。我喜歡使用java.util.concurrent類,它們非常靈活。需要注意以下幾點:

如果事件調度線程上沒有發生異步事件,則需要使用SwingUtilities.invokeLater()來設置JButton文本。

import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.util.concurrent.Executors; 
import java.util.concurrent.ScheduledExecutorService; 
import java.util.concurrent.ScheduledFuture; 
import java.util.concurrent.TimeUnit; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

public class Frame 
{ 
    public static void main(String[] args) 
    { 
     JFrame frame = new JFrame(); 
     final JButton button = new JButton("0"); 

     final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); 

     button.addMouseListener(new MouseAdapter() 
     { 
      int counter = 0; 
      ScheduledFuture<?> future; 

      @Override 
      public void mousePressed(MouseEvent e) 
      { 
       Runnable runnable = new Runnable() 
       { 
        public void run() 
        { 
         SwingUtilities.invokeLater(new Runnable() 
         { 
          public void run() 
          { 
           button.setText(String.valueOf(counter++)); 
          } 
         }); 
        } 
       }; 

       future = executor.scheduleAtFixedRate(runnable, 0, 200, TimeUnit.MILLISECONDS); 
      } 

      @Override 
      public void mouseReleased(MouseEvent e) 
      { 
       if (future != null) 
       { 
        future.cancel(true); 
       } 
      } 

     }); 

     frame.add(button); 
     frame.setSize(400, 400); 
     frame.setVisible(true); 
    } 
} 
相關問題