我想在容器级别处理所有触摸事件。换句话说,我希望所有触摸事件都到达容器级别。现在我发现如果触摸的位置没有落在 View 组包含的 UI 组件上,TouchEvents 只会到达包含的 ViewGroup。包含的 UI 元素处理 TouchEvent,它不会冒泡到容器。有谁知道如何保证所有触摸事件都到达顶级容器?
为了清楚起见,想象一个具有多个按钮、多个编辑文本和多个复选框的 Activity 。一个典型的形式。通常我看到每个 UI 组件都会捕获落在它上面的 TouchEvent,而容器却一点也不聪明。所以我想知道容器/ View 组如何获知所有落在其区域内任何地方的触摸,无论该区域是否被按钮、空白区域或编辑文本占用。
最佳答案
我是这样解释你的问题的:
你有这样的 View 树
- 查看 G 组
- View A
- 观点B
- ...
并且您希望 G 处理触摸时创建的 MotionEvent,即使它被 A、B、...中的任何一个消费了也是如此
如何:
我会给你两个选择。取决于你是否想忽略
的消费- 每个 child
- 仅选定的 child
使用以下模板之一:
重写 G 中的 dispatchTouchEvent()
// In G @Override public boolean dispatchTouchEvent(MotionEvent event) { super.dispatchTouchEvent(event); // Handle event here instead of using an OnTouchListener return true; }
在每个应该忽略消费的 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/