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

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

这是我的 sample

@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和更高版本。但是,就我而言,我不知道如何向 child dispatch 事件。

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

最佳答案

没有简单的方法可以从View中查找源onInterceptTouchEvent,也没有“ dispatch ”这些事件的方法。您可以分派(dispatch)KeyEvent,但不能分派(dispatch)MotionEvent

处理MotionEvent的常见方法(例如,拖放操作)是通过不同的MotionEvent.ACTION_DOWN s(在实现View之后通过onTouch回调)处理OnTouchListener事件,并通过父MotionEvent.ACTION_MOVEViewgroup方法处理onInterceptTouchEvent事件。

但是一些LOC所讲的不只是一堆字。我在这里说的一个很好的例子:http://doandroids.com/blogs/tag/codeexample/

如果您在View本身中处理ACTION_DOWN事件,则可以存储哪个View在其他地方启动了该View,并将该变量用于进一步的操作。在ACTION_UP或ACTION_CANCEL操作完成之前,事件将绑定(bind)到同一 View 。

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

关于Android:ViewGroup,如何拦截MotionEvent,然后将其分发给目标或按需食用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5931947/

10-12 03:33