如何在ViewGroup级别处理所有TouchEvent(即将所有事件冒泡到包含viewgroup)

Cod*_*oid 5 android android-layout

我想处理容器级别的所有触摸事件.换句话说,我希望所有触摸事件都达到容器级别.现在我发现,如果触摸的位置没有落在视图组包含的UI组件上,TouchEvents只会到达包含的ViewGroup.包含的UI元素处理TouchEvent,它不会冒泡到容器.有谁知道如何保证所有触摸事件都达到顶级容器?

为了清楚起见,用几个按钮,几个编辑文本和几个复选框来描绘一个活动.典型的形式.通常情况下,我看到每个UI组件都会捕获落在它上面的TouchEvent,并且容器不是更明智的.因此,我想知道容器/视图组如何被告知在其区域内任何地方的所有触摸,无论该区域是否被按钮,空白区域或编辑文本占据.

Joe*_*ren 8

这是我解释你的问题的方式:

你有像这样的View树

  • ViewGroup G.
    • 查看A.
    • 查看B.
    • ...

并且你希望G处理触摸时创建的MotionEvent,即使它被A,B中的任何一个消耗掉......


如何:

我会给你两个选择.取决于您是否要忽略消费

  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;
     }
    
    Run Code Online (Sandbox Code Playgroud)
  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"
       }
      
      Run Code Online (Sandbox Code Playgroud)
    • 不要忘记设置你的听众

      // 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"
          }
      });
      
      Run Code Online (Sandbox Code Playgroud)

按代码行测量,选项1更简单.选项2是为了以防万一你需要特殊处理A,B ......