25

ボタンを長押ししたときのリピートアクションを実装したい。例:ユーザーがボタンをクリックして押したままにすると、ユーザーがボタンから指を離すまで、一定の間隔で同様のメソッドを何度も呼び出す必要があります。

4

6 に答える 6

77

これを実現する方法は複数ありますが、非常に簡単な方法は、特定の遅延を付けてRunnableonに投稿することです。Handler最も基本的な形式では、次のようになります。

Button button = (Button) findViewById(R.id.button);
button.setOnTouchListener(new View.OnTouchListener() {

    private Handler mHandler;

    @Override public boolean onTouch(View v, MotionEvent event) {
        switch(event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            if (mHandler != null) return true;
            mHandler = new Handler();
            mHandler.postDelayed(mAction, 500);
            break;
        case MotionEvent.ACTION_UP:
            if (mHandler == null) return true;
            mHandler.removeCallbacks(mAction);
            mHandler = null;
            break;
        }
        return false;
    }

    Runnable mAction = new Runnable() {
        @Override public void run() {
            System.out.println("Performing action...");
            mHandler.postDelayed(this, 500);
        }
    };

});

アイデアは非常に単純です。'down ' タッチ アクションが発生しRunnableたときに、 に繰り返されるアクションを含む を投稿します。Handlerその後Runnable、「上」タッチ アクションが経過するまで、再度投稿しないでください。は、タッチアップ アクションによって削除されるまで (「ダウン」タッチ アクションがまだ発生している間) にRunnable自分自身を投稿し続けます。これが「繰り返し」の側面を可能にするものです。Handler

ボタンとその onclick/ontouch の実際の動作に応じて、遅延なく最初の投稿を行うことができます。

于 2012-05-09T07:41:45.457 に答える
1

素晴らしいアイデアではありませんが。onKeyDownこれは、カーソルを 1 ステップ移動してタイマーを再起動する間隔でタイマーを開始して起動することで実現できます。onKeyUpその後、イベントのタイマーをキャンセルできます。これが他のシステムで機能する方法は、通常、最初のキーを押してから、ユーザーが確実にボタンを押していることを確認するために少し待つことです...その後、繰り返しが少し速くなる可能性があります。キーボードのオートリピートを考えてみてください。これは機能し、UI スレッドに悪影響を与えることはありません。

于 2012-05-09T07:25:41.843 に答える
0

View.OnKeyListenerそのビューに を登録できます。そのようなコールバックをデバウンスする方が良いことを考慮してください。そうしないと、メソッドが少しでも「重い」何かを実行している場合、UI がスムーズになりません。

于 2012-05-09T07:19:17.880 に答える