2012-05-09 13 views
20

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

+3

しかし、その私のアプリケーションの必要性。ユーザーがボタンを押している間は常にカーソルを移動したいすべてのタッチでうまくいきます。ユーザーがボタンを押している間、ちょっとしたアクションを繰り返してください。 –

+2

@ JoxTrax:答えにあなたの視点を詳述してください。 –

答えて

59

これを達成するには複数の方法がありますが、ある程度遅れてRunnableHandlerに投稿するのはかなり簡単です。その中で最も基本的な形ですが、それは多少のようになります。

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

}); 

をアイデアは非常に単純です:「ダウン」のタッチアクションが発生したときにHandlerの繰り返しアクションを含むRunnableを投稿してください。その後、「上」のタッチ操作が完了するまで、Runnableを再度送信しないでください。 Runnableは、タッチアップ・アクションによって削除されるまで、(「ダウン」タッチ・アクションはまだ起こっていますが)Handlerにポスティングし続けます。これが、「繰り返す」アスペクトを可能にします。

ボタンの実際の動作とそれに続くonclick/ontouchに応じて、遅れなく最初の投稿をしたいことがあります。

+0

ユーザーがボタンを5秒間押したときに余分なことをしたい場合、そのユーザーがボタンを5秒間保持していることをどのように認識することができますか? –

+0

もう一つの遅延した 'Runnable'を' Handler'に送ることができます。もしそれが一回限りのイベントでなければならないならば、 'Runnable'自体から再度ポストしないでください。また、ボタンが5秒以上経過する前にボタンが離されている場合は、「上へ」アクションでそれを削除することを忘れないでください。 –

+0

ボタンエリア外のリフトがダウンしても、ハンドラが起動します。 ACTION_CANCELは、ACTION_UPでのフォールスルーとして最低限必要です。残念ながら、ボタンがスクロールビューまたはスクロール可能なウィジェットにある場合、このコードは、タッチされたウィジェットがスクリーンから離れていたり、ユーザーの指から離れていても、まだ保持されているように見せます。 –

0

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

1

素晴らしいアイデアはありません。 onKeyDown上のタイマーを起動して、カーソルを1ステップ移動してタイマーを再開する間隔で起動することで達成できます。その後、onKeyUpイベントでタイマーをキャンセルすることができます。これが他のシステムで動作する方法は、通常、最初のキーを押し下げてから、ユーザーが確実にボタンを押していることを確認してから、繰り返しを少し速くすることです。キーボードは自動的に繰り返されると考えてください。これはうまくいくはずですし、uiスレッドに悪影響を及ぼすべきではありません。

+0

なぜそれは素晴らしいアイデアではないと言いますか? – Suragch

関連する問題