0

ビューを互いに重ねて、それらのリスナーを分離することが可能かどうか疑問に思っていました。具体的には、正確に重なり合い、まったく同じ寸法の 2 つのビューがあり、view_one のモーション イベント OnTouchListener と view_two の OnLongPressListener を実装しようとしています。ただし、view_one の OnTouchListener は、view_one の OnLongClickListener をブロックしているようです。

コードの基本的な目標は、複数のタッチ操作でさまざまなことを行うことです。

  1. 短いクリックは 1 つのことを行います
  2. 長押しすると別のことができます
  3. 垂直方向のタッチドラッグアンドリリースは別のことを行います
  4. 横方向にタッチドラッグ

などなど、なるべくいろいろ。

おそらく、2 つではなく 1 つのタッチ用のビューが必要であり、タッチ イベントとモーション イベントを分離する方法があります。短押しイベントと長押しイベントを分離する方法は知っていますが、モーション イベントによって問題が発生します。

これを行うにはもっと良い方法があると確信しています。ヒントや提案は大歓迎です。どのアクションを実行するかを決定するのに役立つ、スライド モーションの長さとタッチ時間に制限を設ける方法はありますか?

4

1 に答える 1

0

質問の最初の部分に答えるには、タッチ リスナーが view_two (下のビュー) に到達する前にイベントを消費している場合は、onTouchListenerでタッチ イベントを消費している可能性があります。

//Returns true if the listener has consumed the event, false otherwise.
public abstract boolean onTouch (View v, MotionEvent event)

このメソッドで常に false を返していますか? そうでない場合、おそらく階層内の次のビューに伝播されないイベントがあります。

2 番目の質問については、確かにonTouchListenerを作成して、これらすべてのイベントを処理できます。これは、短押しと長押しを行う例です (どれだけの動きがあるかに関係なく):

private MotionEvent downEvent;

public abstract boolean onTouch (View v, MotionEvent event){
    if (downEvent == null && event.getAction == MotionEvent.ACTION_DOWN){
        downEvent = event;
        return false;
    }


    if (event.getAction == MotionEvent.ACTION_UP){
        if (event.getDownTime() > LONG_PRESS_THRESHOLD){
            ... do something ...
        } else if (event.getDownTime() > SHORT_PRESS_THRESHOLD){
            ... do something else ...
        } 
    }
}

ご想像のとおり、ダウン イベントと現在のイベントの間のデルタ X / デルタ Y が、イベント 3 と 4 に対して決定したしきい値を満たしているかどうかを判断するには、もう少しエフォート ラインが必要です。

于 2013-03-29T17:52:51.447 に答える