5

假设您有一个TextView显示像 0 这样的数字,而您有一个Button. 现在,如果用户按下按钮,TextView 中的数字将增加一(这我知道该怎么做),但如果用户按下按钮并且不释放它,那么TextView应该增加数字,这应该重复它只要用户不释放Button. 换句话说:只要用户按住按钮,如何一遍又一遍地增加数字?

4

3 回答 3

6

一种通用方法(不是特定于 Android)是分别检测 press 和 release 事件。按下事件会启动一个周期性任务(RunnableThread),它会增加计数器(假设每秒 5 次,或每 200 毫秒一次)。释放事件停止周期性任务。

于 2012-04-03T22:08:04.137 回答
2

您需要在收到事件时安排异步重复事件,并在收到事件时mousePressed停止它mouseReleased

在 Java 中有很多方法可以处理这个问题。我喜欢使用java.util.concurrent非常灵活的类。不过有几点要记住:

如果您的异步事件没有在 Event Dispatch Thread 上发生,您需要JButton使用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 );
    }
}
于 2012-04-03T22:23:20.267 回答
1
  1. View.OnLongClickListener为您的按钮设置一个
  2. 给你的活动一个Runnable,并在你加载活动时初始化(但不要启动它)
  3. 让 OnLongClickListener 执行其更新文本框的常规异步任务并检查自首次单击以来的时间
  4. 创建一个在触摸事件被释放时OnTouchListener暂停的。Runnable

我知道这是一个粗略的草案,但这是一个非常有用的模式,可以重用和修改,所以值得你将爪子投入其中......

于 2012-04-03T22:15:16.940 回答