鉴于存在一个带有多个子级的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_MOVE
的Viewgroup
方法处理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/