fif*_*fth 5 android event-handling motion
鉴于有一个 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);
}
Run Code Online (Sandbox Code Playgroud)
为了能够吃一些事件,当发生DOWN事件时,我必须在上述两种方法中返回true,因为SDK是这样说的。然后我可以在 onTouchEvent 中看到 MOVE 和 up。但是,就我而言,我不知道如何将事件分派给孩子。
上面的 dispatchTouchEvent 导致无限循环,这是可以理解的,因为 VG 本身可能是目标。我当时不知道哪个是目标,MotionEvent没有给出提示,所以dispatchTouchEvent完全没用。
有人帮我吗?谢谢。
没有简单的方法可以View从中找到源onInterceptTouchEvent,也没有办法“调度”这些事件。您可以调度KeyEvents,但不能调度MotionEvents。
处理MotionEvents(例如,拖放)的常见方法是MotionEvent.ACTION_DOWN通过不同的Views 处理事件(通过onTouch实现后的回调OnTouchListener),并MotionEvent.ACTION_MOVE通过父级Viewgroup的onInterceptTouchEvent方法处理事件。
但有些 LOC 所说的不仅仅是一堆话。我在这里所说的有一个很好的例子:http ://doandroids.com/blogs/tag/codeexample/
如果您在视图本身中处理 ACTION_DOWN 事件,那么您可以存储哪个视图在其他地方启动它并使用该变量进行进一步的操作。事件绑定到同一个视图,直到通过 ACTION_UP 或 ACTION_CANCEL 操作完成。
如果您需要在 ACTION_DOWN 期间跟踪视图并在 ViewGroup 上执行操作,那么我建议您在 ViewGroup 中添加一个公共方法(例如,public boolean handleActionDown (View v, MotionEvent e)将从 onTouch 回调中调用)
| 归档时间: |
|
| 查看次数: |
14486 次 |
| 最近记录: |