0

ユーザーがクリックすると、ケース MotionEvent.ACTION_DOWN がトリガーされます。クリックが離されると、ケース MotionEvent.ACTION_UP がトリガーされます。

ACTION_DOWN から 3 秒以内に ACTION_UP がトリガーされていないかどうかを判断したいと考えています。つまり、ユーザーがクリックしてから 3 秒経過しても離していない場合は、基本的に長いクリックを判断しようとして知りたいのです。

そのようなことを行う方法はありますか?

   switch (event.getAction()) {
       case MotionEvent.ACTION_DOWN:
       break;
       case MotionEvent.ACTION_UP:
       break;
    }
4

3 に答える 3

3

通常、ロングクリックを検出する正しい方法は、 View.OnLongClickListenerを実装することです。これは、自分で検出するよりも簡単でエラーが発生しにくく、アプリがシステムの残りの部分にうまく適合することを保証します。

customViewの場合implements View.OnLongClickListener、クラス宣言に追加setOnLongClickListener(this);し、コンストラクターに追加して、onLongClick()メソッドをクラスに追加します。

public boolean onLongClick (View v) {
    // Handle long-click
}

カスタムでない場合Viewは、次のようにリスナーを追加できます。

theView.setLongClickable(true);
theView.setOnLongClickListener(new View.OnLongClickListener() {
    public boolean onLongClick(View v) {
        // Handle long-click
    }
});

更新:わかりました、掘り下げました。これは、これまでに使用したすべてのビューで正しい方法ですが、実際には、質問者が使用している SeekBars では機能しません。この事実はドキュメントには記載されていませんSeekBarが、実験によりそれが正しいことが示され、ソース コードを掘り下げると、その理由が示されSeekBar.onTouchEvent()ますsuper.onTouchEvent()。必要に応じて呼び出されますView.onTouchEvent()performLongClick()

必要に応じて実装する方法は、Handler.postDelayed(). ACTION_DOWN でRunnable、長押しを処理するa を (たとえば 3000 ミリ秒の遅延で) 投稿Handlerし、ACTION_UP でそれをキャンセルします。そのため、遅延未満のプレスは最終的に を呼び出すことにはなりませんRunnableが、ACTION_UP が遅延後に発生しなかった場合は、それが発生します。

そうは言っても、これを行うことをまったく考え直すように警告します。を長押しするとはどういう意味SeekBarですか? ユーザーが「親指」を遅延よりも長くドラッグしている場合、突然、おそらく意図されていない長押しが発生します。親指を動かすたびに遅延をキャンセルしてリセットすることができ、正確に 1 つの位置で数秒間長押しする必要があります。しかし、完全に静止していることはめったにありません。実際、親指を数秒間動かさずに保持することは困難です。したがって、遅延をリセットする親指の位置の変更を最小限に抑えることができます。やむを得ない場合はそうしますが、非常に奇妙なユーザー エクスペリエンスだと言わざるを得ません。

于 2012-06-13T06:04:05.657 に答える
0

そのシンプルで簡単です。イベント間の時間差を評価するには、タイムスタンプを取得する必要があります。次の例のように行うことができます。

private static int TIME_MARGIN = 3;  //seconds
private Date d1 = null;

public void OnWhatEverOnClickEvent(Event event){
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
           d1 = new Date();
        break;
        case MotionEvent.ACTION_UP:
           Date d2 = new Date();
           if((d2.getTime() - d1.getTime()) >= (TIME_MARGIN * 1000L)){
               //its a long click due to 3 seconds hold, do something here
           }
        break;
    }
}

ただし、@ Darshan Computingが言ったようにView.OnLongClickListener、手間のかからないアプローチである方をうまく利用する必要があります。

于 2012-06-13T06:02:28.910 に答える
0

ユーザーがクリックすると、ボタンの現在の状態をポーリングする新しいスレッドを開始します (または、 で設定DOWNおよびリセットされる新しいフラグを導入しUPます。スレッドは、この状態またはフラグを 100 ミリ秒ごとにポーリングし、内部タイムスタンプを使用して、 3 秒が経過した場合、長いクリックのアクションを開始する新しいイベントが発生する可能性があります

于 2012-06-13T06:20:28.427 に答える