gpt4 book ai didi

android - 如何在 ViewGroup 级别处理所有 TouchEvent(即冒泡所有事件直至包含 View 组)

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:16:48 24 4
gpt4 key购买 nike

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

为了清楚起见,想象一个具有多个按钮、多个编辑文本和多个复选框的 Activity 。一个典型的形式。通常我看到每个 UI 组件都会捕获落在它上面的 TouchEvent,而容器却一点也不聪明。所以我想知道容器/ View 组如何获知所有落在其区域内任何地方的触摸,无论该区域是否被按钮、空白区域或编辑文本占用。

最佳答案

我是这样解释你的问题的:

你有这样的 View 树

  • 查看 G 组
    • View A
    • 观点B
    • ...

并且您希望 G 处理触摸时创建的 MotionEvent,即使它被 A、B、...中的任何一个消费了也是如此


如何:

我会给你两个选择。取决于你是否想忽略

的消费
  1. 每个 child
  2. 仅选定的 child

使用以下模板之一:

  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. 在每个应该忽略消费的 child 中覆盖 dispatchTouchEvent()

    • 忽略部分 child

      // 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 中的某些内容进行特殊处理...

关于android - 如何在 ViewGroup 级别处理所有 TouchEvent(即冒泡所有事件直至包含 View 组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11460789/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com