简述Activity ViewGroup和View都不消费ACTION_DOWN,那么ACTION_UP事件是怎么传递的 ?

参考回答:

ActivityViewGroupView都没有消费ACTION_DOWN事件时,ACTION_UP事件的传递会遵循Android事件分发机制。通常,ACTION_DOWN事件会从根视图开始传递到最上层的控件,而ACTION_UP事件则会从最上层的控件传递回父控件直到根视图。具体而言,ACTION_UP事件会被传递给当前捕获到ACTION_DOWN的最接近控件,直到它被消费为止。

详细讲解与拓展:

1. 事件传递流程

  • ACTION_DOWN:当用户触摸屏幕时,事件会从最顶层的视图(例如Activity)开始传递,传递到ViewGroup,然后再传递给子视图View。如果这些控件没有消费ACTION_DOWN事件,它会继续向下传递。
  • ACTION_UPACTION_UP事件会沿着相反的路径传递,也就是说,它会从最深的子视图开始回溯,传递给父视图,最终传递给Activity。如果ACTION_DOWN事件没有被消费,ACTION_UP事件同样会按顺序传递,直到找到一个能消费它的控件。

2. 没有消费ACTION_DOWN时的行为

  • 如果ACTION_DOWN事件没有在ActivityViewGroupView中被消费,这意味着控件并没有标记为处理该事件。因此,ACTION_UP事件会从第一个接收到ACTION_DOWN的控件开始传递,直到找到一个能够处理事件的地方。
  • 如果没有控件处理ACTION_DOWN事件,那么ACTION_UP事件可能会在根视图中被捕获并处理,或者系统可能会将该事件视为无效并不作处理。

3. 视图不消费ACTION_DOWN,如何传递ACTION_UP

  • 如果ActivityViewGroupView都没有消费ACTION_DOWN事件,事件会传递到下一个层次的父控件或子控件。只要ACTION_DOWN事件被接收并且没有消费,ACTION_UP事件会按反向顺序传递给最先接收ACTION_DOWN的控件。
  • 如果ACTION_DOWN事件最终没有在任何地方被消费,ACTION_UP仍会传递并可以在Activity中进行处理。

    示例
    如果ActivityViewGroupView都没有拦截ACTION_DOWN,但是View接收了ACTION_UP,那么ACTION_UP会从View开始回溯:

    @Override
    public boolean onTouchEvent(MotionEvent event) {
      switch (event.getAction()) {
          case MotionEvent.ACTION_DOWN:
              // 没有消费ACTION_DOWN事件
              break;
          case MotionEvent.ACTION_UP:
              // ACTION_UP事件会传递给View并处理
              break;
      }
      return super.onTouchEvent(event);
    }
    
    Java

4. 父控件和子控件事件冲突

  • 如果父控件没有消费ACTION_DOWN事件,子控件可以处理ACTION_DOWN事件。然后ACTION_UP会回传给父控件。在这种情况下,父控件可能决定是否消费ACTION_UP,如果没有消费,事件会传递回Activity

5. 总结

ActivityViewGroupView都没有消费ACTION_DOWN事件时,ACTION_UP事件会被传递给最后一个接收到ACTION_DOWN的控件,并根据视图层次结构传递回父控件,最终可能会传递给Activity。如果没有控件拦截事件,则ACTION_UP会被认为是一个无效事件,通常不会进一步处理。

发表评论

后才能评论