ボタンを長押ししたときのリピートアクションを実装したい。例:ユーザーがボタンをクリックして押したままにすると、ユーザーがボタンから指を離すまで、一定の間隔で同様のメソッドを何度も呼び出す必要があります。
6 に答える
これを実現する方法は複数ありますが、非常に簡単な方法は、特定の遅延を付けてRunnable
onに投稿することです。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 の実際の動作に応じて、遅延なく最初の投稿を行うことができます。
素晴らしいアイデアではありませんが。onKeyDown
これは、カーソルを 1 ステップ移動してタイマーを再起動する間隔でタイマーを開始して起動することで実現できます。onKeyUp
その後、イベントのタイマーをキャンセルできます。これが他のシステムで機能する方法は、通常、最初のキーを押してから、ユーザーが確実にボタンを押していることを確認するために少し待つことです...その後、繰り返しが少し速くなる可能性があります。キーボードのオートリピートを考えてみてください。これは機能し、UI スレッドに悪影響を与えることはありません。
View.OnKeyListener
そのビューに を登録できます。そのようなコールバックをデバウンスする方が良いことを考慮してください。そうしないと、メソッドが少しでも「重い」何かを実行している場合、UI がスムーズになりません。