我有一个自定义的ViewGroup,其覆盖了onInterceptTouchEvent()。它接收ACTION_DOWN但从未收到ACTION_MOVE。我的理解是,除非它返回" true",它应该接收所有MotionEvents。
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;
}
我还有onTouch的代码,除了ACTION_MOVE中的一个案例外,它返回false;但是,只调用ACTION_DOWN调用它;因此它只会返回假。
答案 0 :(得分:20)
比这复杂一点。首先,您需要覆盖onTouchEvent()
并在那里处理ACTION_DOWN
和MOVE
个事件。然后会发生以下情况。
ACTION_DOWN
事件首先被调度到onInterceptTouchEvent()
。你应该从那里返回false
。ACTION_DONW
事件的位置下方没有可触摸视图,则会将ACTION_DOWN
事件和所有后续事件分派到onTouchEvent()
。您必须从那里返回true
。只有这样,您才会收到发送到onTouchEvent()
方法的后续活动。无论您是返回true
还是false
,onInterceptTouchEvent()
都不会再收到任何跟进事件。onInterceptTouchEvent()
(包括ACTION_MOVE
个事件)。在检测到手势后,您需要从那里返回true
。从此处返回true
后,可触摸视图将收到ACTION_CANCEL
个事件,并且所有其他事件将被调度到onTouchEvent()
方法。希望这有帮助。