5

すべてのタッチ イベントをコンテナー レベルで処理したいと考えています。つまり、すべてのタッチ イベントがコンテナー レベルに到達するようにします。現在、TouchEvents は、ビュー グループに含まれる UI コンポーネントにタッチの位置が到達しない場合にのみ、含まれている ViewGroup に到達することがわかりました。含まれている UI 要素は TouchEvent を処理し、コンテナにバブルアップしません。すべてのタッチイベントが最上位のコンテナに到達することを保証する方法を知っている人はいますか?

明確にするために、いくつかのボタン、いくつかの編集テキスト、およびいくつかのチェック ボックスを備えたアクティビティを想像してください。典型的な形。通常、各 UI コンポーネントがそれに着地する TouchEvent をキャッチし、コンテナーが賢明ではないことがわかります。したがって、その領域がボタン、空のスペース、または編集テキストで占有されているかどうかに関係なく、その領域内のどこかに着陸するすべてのタッチをコンテナ/ビューグループに通知する方法を知りたいです。

4

2 に答える 2

8

これが私があなたの質問を解釈する方法です:

あなたはこのようなビューツリーを持っています

  • ビューグループ G
    • ビューA
    • ビューB
    • ...

A、B、...のいずれかによって消費された場合でも、タッチ時に作成された MotionEvent を G で処理する必要があります。


方法:

2 つのオプションを提示します。消費を無視するかどうかに応じて

  1. すべての子供
  2. 選ばれた子だけ

次のテンプレートのいずれかを使用します。

  1. G で dispatchTouchEvent() をオーバーライドする

    // In G
    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
         super.dispatchTouchEvent(event);
    
         // Handle event here instead of using an OnTouchListener
    
         return true;
     }
    
  2. 消費を無視する必要があるすべての子で、dispatchTouchEvent() をオーバーライドします。

    • 一部の子を無視する

      // In every child whose consumption should be ignored
      @Override
      public boolean dispatchTouchEvent(MotionEvent event) {
           super.dispatchTouchEvent(ev);
      
           return false; // false means "I did not consume the event"
       }
      
    • リスナーのセットアップを忘れないでください

      // In G, before touch should be recognized
      setOnTouchListener(new OnTouchListener() {
          @Override
          public boolean onTouch(View v, MotionEvent event) {
              // Handle event here
      
              return true; // true means "I did consume the event"
          }
      });
      

コードの行数で測定すると、オプション 1 の方がはるかに単純です。オプション 2 は、A、B の一部に対して特別な処理が必要な場合に備えて用意されています。

于 2012-08-06T15:11:29.253 に答える