2012-04-03 39 views
5

Giả sử bạn có số TextView hiển thị số như 0 và bạn có số Button. Bây giờ nếu người dùng nhấn nút Số trong TextView sẽ tăng cho một (điều này tôi biết làm thế nào để làm) nhưng nếu người dùng nhấn nút và không phát hành nó thì số trong TextView nên được tăng lên nên lặp lại nó tự miễn là người dùng không phát hành Button. Nói cách khác: Làm thế nào để tăng số lượng hơn và hơn nữa miễn là người dùng giữ nút?Lặp lại thao tác khi nhấn nút dài

Trả lời

6

Cách tiếp cận chung (không dành riêng cho Android) sẽ là phát hiện riêng sự kiện báo chí và phát hành. Sự kiện báo chí bắt đầu một tác vụ định kỳ (Runnable hoặc Thread) thêm vào bộ đếm (chúng ta hãy nói 5 lần một giây, hoặc cứ 200 ms một lần). Sự kiện phát hành dừng nhiệm vụ định kỳ.

1
  1. Thiết lập một View.OnLongClickListener cho nút của bạn
  2. Đưa hoạt động của bạn một Runnable, và khởi tạo (nhưng không bắt đầu nó) khi bạn tải các hoạt động
  3. Có OnLongClickListener làm nhiệm vụ async thường kỳ cập nhật hộp văn bản và kiểm tra thời gian từ lần đầu tiên được nhấp vào
  4. Tạo OnTouchListener tạm dừng Runnable khi sự kiện chạm được thực hiện.

Tôi biết đó là một dự thảo thô, nhưng đây là một mô hình thực sự hữu ích để có thể tái sử dụng và sửa đổi, vì vậy nó có giá trị chìm móng vuốt của mình vào nó ...

+0

+1 Điều này nghe giống như quy trình cụ thể của Android mà tôi mô tả tổng quát hơn. –

2

Bạn sẽ cần phải sắp xếp một sự kiện lặp lại không đồng bộ khi bạn nhận được sự kiện mousePressed và dừng sự kiện đó khi bạn nhận được sự kiện mouseReleased.

Có nhiều cách để xử lý điều này trong Java. Tôi thích sử dụng các lớp học java.util.concurrent, khá linh hoạt. Tuy nhiên, có một vài điều cần lưu ý:

Nếu sự kiện không đồng bộ của bạn không xảy ra trên Chủ đề công văn sự kiện, bạn cần đặt văn bản JButton bằng cách sử dụng SwingUtilities.invokeLater().

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); 
    } 
} 
Các vấn đề liên quan