按下长按钮时重复操作

时间:2012-04-03 22:02:33

标签: java android button textview repeat

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

3 个答案:

答案 0 :(得分:6)

一般方法(不是特定于Android)将分别检测按下和释放事件。新闻事件开始一个周期性任务(RunnableThread),它会增加到计数器(让我们说每秒5次,或者每200 ms一次)。发布事件会停止定期任务。

答案 1 :(得分:2)

您收到mousePressed活动时需要安排异步重复活动,并在收到mouseReleased活动时停止活动。

有很多方法可以用Java来处理这个问题。我喜欢使用java.util.concurrent类,它们非常灵活。不过要注意以下几点:

如果您的异步事件未在事件发送线程上发生,则需要使用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 );
    }
}

答案 2 :(得分:1)

  1. 为按钮设置View.OnLongClickListener
  2. 为您的活动提供Runnable,并在加载活动时初始化(但不要启动)
  3. 让OnLongClickListener执行常规异步任务,更新文本框并检查自首次单击以来的时间
  4. 创建OnTouchListener,以便在触发事件发布时暂停Runnable
  5. 我知道这是一个粗略的草稿,但这是一个非常有用的模式,能够重复使用和修改,所以值得你的爪子沉入其中......