5

TextView0 のような数値を表示する があり、 があるとしますButton。ユーザーがボタンを押すと、TextView の数値が 1 増加します (これは方法を知っています) が、ユーザーがボタンを押して離さない場合は、数値をTextView増やして、これを繰り返す必要があります。ユーザーがButton. 言い換えれば、ユーザーがボタンを押している間、数値を何度も増やす方法は?

4

3 に答える 3

6

一般的なアプローチ (Android に固有ではない) は、プレス イベントとリリース イベントを別々に検出することです。プレスイベントは、カウンターに追加する周期的なタスク (RunnableまたはThread) を開始します (1 秒間に 5 回、または 200 ミリ秒ごとに 1 回としましょう)。リリース イベントは定期的なタスクを停止します。

于 2012-04-03T22:08:04.137 に答える
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 );
    }
}
于 2012-04-03T22:23:20.267 に答える
1
  1. View.OnLongClickListenerボタンに を設定する
  2. アクティビティに をRunnable指定し、アクティビティをロードするときに初期化します (ただし、開始しないでください)。
  3. OnLongClickListener に、テキスト ボックスを更新し、最初にクリックされてからの時間を確認する通常の非同期タスクを実行させます。
  4. タッチ イベントが発生しOnTouchListenerたときに を一時停止する を作成します。Runnable

これが大まかなドラフトであることは承知していますが、これは再利用および変更できる非常に便利なパターンであるため、タロンを沈めておく価値があります...

于 2012-04-03T22:15:16.940 に答える