按住按钮时重复执行一个动作

5
假设你有一个显示数字0的TextView和一个Button。现在,如果用户按下按钮,则TextView中的数字将增加1(我知道如何做)。但是,如果用户按下按钮并不释放,则TextView中的数字应该增加,并且只要用户不释放Button,就应该重复这个过程。换句话说:如何在用户按住按钮时不断增加数字?
3个回答

6

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


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 );
    }
}

1
  1. 为您的按钮设置View.OnLongClickListener
  2. 为您的活动创建一个Runnable,并在加载活动时进行初始化(但不要启动它)
  3. 让OnLongClickListener执行其常规异步任务,更新文本框并检查从第一次单击以来经过的时间
  4. 创建一个OnTouchListener,当触摸事件释放时暂停Runnable

我知道这只是一个草稿,但这是一种非常有用的模式,可以重新使用和修改,所以值得深入研究...


+1 这听起来像是我更一般性地描述的 Android 特定过程。 - Tim Bender

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接