5

鉴于有一个 ViewGroup 有几个孩子。至于这个 ViewGroup,我想让它为其所有子级管理所有 MotionEvent,这表示 VG 将
1. 能够在所有事件被分派到目标(子级)之前拦截所有事件
2. VG 将首先使用该事件,并确定是否会进一步向目标孩子
3 派发事件。DOWN、MOVE、UP,我希望将它们视为相对独立,这意味着 VG 可以吃 DOWN,但将 MOVE 和 UP 给孩子。

我已经阅读了 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。但是,就我而言,我不知道如何将事件发送给孩子。

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

4

1 回答 1

4

没有简单的方法可以View从中找到源onInterceptTouchEvent,也没有“调度”这些事件的方法。您可以发送KeyEvents,但不能发送MotionEvents。

处理MotionEvents 的常用方法(例如拖放)是MotionEvent.ACTION_DOWN通过不同View的 s 处理事件(通过onTouch实现后的回调OnTouchListener),并MotionEvent.ACTION_MOVE通过 parentViewgrouponInterceptTouchEvent方法处理事件。


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


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

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

于 2011-05-09T03:13:59.767 回答