gpt4 book ai didi

Android: ViewGroup,如何拦截MotionEvent然后派发到target或者按需吃?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:15:34 26 4
gpt4 key购买 nike

假设有一个包含多个子项的 ViewGroup。至于这个 ViewGroup,我想让它管理所有子项的所有 MotionEvent,这表示 VG 将
1. 能够在事件被发送到目标( child )之前拦截所有事件
2. VG会先消费事件,再判断是否进一步派发事件给 objective-c hild
3. DOWN, MOVE, UP,我想把他们看成是相对独立的,也就是说VG可以吃DOWN,但是把MOVE和UP给 children 。

我读过 SDK 指南“处理 UI 事件”,我知道事件监听器、处理程序、ViewGroup.onInterceptTouchEvent(MotionEvent) 和 View.onTouchEvent(MotionEvent)。

这是我的例子,

@Override
public boolean onInterceptTouchEvent (MotionEvent event) {
if (MotionEvent.ACTION_DOWN == event.getAction()) {
return true;
}

return super.onInterceptTouchEvent(event);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
if (MotionEvent.ACTION_DOWN == event.getAction()) {
return true;
}
else {
if (!consumeEvent(event)) {
// TODO: dispatch to target since I didn't want to eat event
//return this.dispatchTouchEvent(event); // infinite loop!!!
}
}


return super.onTouchEvent(event);
}

为了能够吃掉一些事件,当 DOWN 事件发生时,我必须在上面的两个方法中返回 true,因为 SDK 是这么说的。然后我可以在 onTouchEvent 中看到 MOVE 和 up。但是,就我而言,我不知道如何将事件分派(dispatch)给 child 。

上面的 dispatchTouchEvent 导致无限循环,这是可以理解的,因为 VG 本身可能是目标。我当时不知道哪个是目标,MotionEvent 没有给出提示,所以 dispatchTouchEvent 完全没用。
有人帮帮我吗?谢谢。

最佳答案

没有简单的方法可以找到来源 View来自 onInterceptTouchEvent ,也没有办法"dispatch"这些事件。可以发KeyEvent s,但不是 MotionEvent

常见的处理方式MotionEvent s(例如,用于拖放)是处理 MotionEvent.ACTION_DOWN不同的事件View s(通过 onTouch 实现后的回调 OnTouchListener ),以及 MotionEvent.ACTION_MOVE通过 parent 的事件 ViewgrouponInterceptTouchEvent方法。


但有些 LOC 说的远不止是一堆单词。有一个很好的例子可以说明我在这里所说的:http://doandroids.com/blogs/tag/codeexample/


如果您在 View 本身中处理 ACTION_DOWN 事件,那么您可以存储哪个 View 在其他地方启动它,并使用该变量进行进一步的操作。事件绑定(bind)到同一个 View ,直到被 ACTION_UP 或 ACTION_CANCEL 操作完成。

如果您需要在 ACTION_DOWN 期间跟踪 View 并在 ViewGroup 上执行操作,那么我建议您在 ViewGroup 中添加一个公共(public)方法(例如 public boolean handleActionDown (View v, MotionEvent e) 将从 onTouch 回调中调用

关于Android: ViewGroup,如何拦截MotionEvent然后派发到target或者按需吃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5931947/

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