我有一个覆盖了 onInterceptTouchEvent() 的自定义 ViewGroup。它收到 ACTION_DOWN 但从未收到 ACTION_MOVE。据我了解,除非它返回“true”,否则它应该接收所有 MotionEvents。
ViewGroup 包含两个 View ,一个 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
和 MOVE
事件。然后会发生以下情况。
ACTION_DOWN
事件首先被分派(dispatch)到onInterceptTouchEvent()
。您应该从那里返回false
。- 现在有两种情况:
- 如果在 View 树中
ACTION_DONW
事件的位置下没有可触摸 View ,则ACTION_DOWN
事件和所有后续事件将被分派(dispatch)到onTouchEvent()
。您必须从那里返回true
。只有这样,您才会收到发送到onTouchEvent()
方法的后续事件。无论您返回true
还是false
,onInterceptTouchEvent()
都不会再收到任何后续事件。 - 如果有一个可触摸 View ,那么所有事件都将被分派(dispatch)到
onInterceptTouchEvent()
(包括ACTION_MOVE
事件)。在检测到您的手势后,您需要从那里返回true
。从此处返回true
后,可触摸 View 将收到ACTION_CANCEL
事件,所有其他事件都将分派(dispatch)给onTouchEvent()
方法。
- 如果在 View 树中
希望这对您有所帮助。
关于android - onInterceptTouchEvent 从不接收 action_move,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23725102/