我有一个自定义 ViewGroup 并覆盖了 onInterceptTouchEvent()。它收到 ACTION_DOWN 但从未收到 ACTION_MOVE。据我了解,除非它返回“true”,否则它应该接收所有 MotionEvent。
ViewGroup 包含两个视图:ImageView 和 GridLayout。
我的拦截代码是:
@Override
public boolean onInterceptTouchEvent(MotionEvent ev)
{
final int action = ev.getAction();
switch (action & MotionEvent.ACTION_MASK)
{
case MotionEvent.ACTION_DOWN:
logD ("DDV Intercept DOWN");
break;
case MotionEvent.ACTION_POINTER_DOWN:
logD ("DDV Intercept P DOWN"); // logD: shell around Log.d()
break;
case MotionEvent.ACTION_MOVE:
logD ("DDV Intercept MOVE");
break;
case MotionEvent.ACTION_UP:
logD ("DDV Intercept UP");
break;
case MotionEvent.ACTION_POINTER_UP:
logD ("DDV Intercept P UP " + ev.getActionIndex());
break;
case MotionEvent.ACTION_CANCEL:
logD ("DDV Intercept CANCEL");
break;
default:
logD ("DDV Intercept " + (action & MotionEvent.ACTION_MASK));
}
return false;
}
除了 ACTION_MOVE 中的一种情况外,我还有返回 false 的 onTouch 代码;然而,它仅在 ACTION_DOWN 被调用时被调用;因此它只返回 false。
实际情况比这要复杂一些。首先你需要重写onTouchEvent()
并处理ACTION_DOWN
and MOVE
那里也有活动。然后就会发生下面的情况。
-
ACTION_DOWN
事件被发送到onInterceptTouchEvent()
第一的。你应该回来false
从那里。
- Now there are two cases:
- 如果下方没有可触摸的视野
ACTION_DONW
事件在视图树中的位置,然后ACTION_DOWN
事件和所有后续事件都被分派到onTouchEvent()
。你必须返回true
从那里。只有这样您才会收到发送至的后续事件onTouchEvent()
方法。与您是否返回无关true
or false
, onInterceptTouchEvent()
将不再收到任何后续事件。
- 如果存在可触摸视图,则所有事件将被分派到
onInterceptTouchEvent()
(包括ACTION_MOVE
事件)。你需要返回true
在您检测到您的手势后,从那里开始。一旦你回来true
从这里开始,可触摸视图将收到ACTION_CANCEL
事件和所有进一步的事件将被发送到onTouchEvent()
method.
希望这可以帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)