我有一个自定义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;
}
我还有onTouch的代码,除了ACTION_MOVE中的一个案例外,它返回false;但是,只调用ACTION_DOWN调用它;因此它只会返回错误 .
1 回答
它有点复杂 . 首先,您需要覆盖
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()
方法 .希望这可以帮助 .