我正在尝试在RecyclerView中滚动MapView,因此我在TouchEvent之前和之后设置requestDisallowInterceptTouchEvent()
。
奇怪的是:如果我在dispatchTouchEvent()
方法中设置它,这确实有效,但如果我在onTouchEvent()
方法中执行相同的操作,则无效。
有人可以解释为什么我不能在onTouchEvent()
中设置它吗?
工作:
public class WorkingScrollableListItemMapView extends MapView {
// constructors
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
// Stop parents from handling the touch
this.getParent().requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_UP:
// Allow parents from handling the touch
this.getParent().requestDisallowInterceptTouchEvent(false);
break;
}
return super.dispatchTouchEvent(ev);
}
}
不工作:
public class NotWorkingScrollableListItemMapView extends MapView {
// constructors
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_UP:
// Allow parents from handling the touch
this.getParent().requestDisallowInterceptTouchEvent(false);
break;
case MotionEvent.ACTION_DOWN:
// Stop parents from handling the touch
this.getParent().requestDisallowInterceptTouchEvent(true);
break;
}
return super.onTouchEvent(ev);
}
}
答案 0 :(得分:1)
处理事件的调用序列有点按此顺序: onInterceptTouchEvent,onDispatchTouchEvent,dispatchTouchEvent,onTouchEvent。 对我来说,这表明onTouchEvent是处理事件的最后一步。操纵哪里和哪里都为时已晚谁在最后一步处理事件。如果你看一下处理事件的早期方法,源代码会说什么?