Прокручиваемый MapView внутри RecyclerView: dispatchTouchEvent vs onTouchEvent
Я пытаюсь иметь прокручиваемый MapView внутри RecyclerView, поэтому я устанавливаю requestDisallowInterceptTouchEvent()
до и после TouchEvent.
Странная вещь: это работает, если я установлю это в 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);
}
}
1 ответ
Последовательность вызовов для обработки события несколько в следующем порядке: onInterceptTouchEvent, onDispatchTouchEvent, dispatchTouchEvent, onTouchEvent. Для меня это означает, что onTouchEvent - самый последний шаг в обработке события. Было бы слишком поздно манипулировать, где и кем обрабатывается событие на самом последнем этапе. Что говорит исходный код, если вы посмотрите на более ранние методы обработки события?