Я прочитал несколько разных ответов по этому же вопросу, поэтому я не знаю, какой из них прав, тогда я решил снова спросить его. Попробуйте не ссылаться на другую ссылку в этом ответе. Если вы хотите сделать это, я буду ожидать немного дополнительного объяснения.
Мой вопрос: у меня есть ImageView
внутри ViewPager
, у моего ImageView
есть обнаружение жестов (масштабирование и панорамирование), и я использую ViewPager
по умолчанию, который по умолчанию обнаруживает салфетки. Как работает цепочка событий onTouch? Самый низкий вид в моей иерархии всегда будет включен onTouch, и если метод вернет false, родительский элемент обработает его? Возможно, наоборот?
Я прошу об этом, потому что у меня есть ImageView
который имеет жесты слева и справа, и когда я попадаю в край изображения, мне нужно отправить событие родительскому (ViewPager
) для обработки события разбиения на страницы. любой дальнейший совет в том, как это сделать, это будет действительно оценено.
Итак, я справился с несколькими касаниями в представлении детей ViewPager лучше, чем onInterceptTouchEvent, я говорю это, потому что в моем случае, чтобы узнать, нужно ли мне прокручивать представления детей вместо пейджера, мне нужно было расстояние между начальной и конечной точками, и я не хотел удерживать эти переменные и вычислять дельту впоследствии.
В любом случае, перейдя в исходный код для ViewPager, я узнал, что есть действительно хороший метод, который я должен реализовать по этой причине. Вот моя реализация:
@Override
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
if (v instanceof ImageViewTouch) {
return ((ImageViewTouch) v).canScroll(dx);
} else {
return super.canScroll(v, checkV, dx, x, y);
}
}
Он работает противоположно ViewPager ест сенсорные события, а затем ImageView получит его.
Я бы использовал onInterceptTouchEvent (MotionEvent ev) в пользовательском представлении Pager. В MotionEvent вы захотите проанализировать, сколько точек касания есть ev.getPointerCount().
Если у вас есть ev.getPointerCount() == 2, вы, вероятно, захотите сделать щепотку и масштабирование внутри ImageView.
Если у вас ev.getPointerCount() == 1, то вы, вероятно, намерены прокручивать страницы View Pager или выполнять панорамирование в ImageView. Чтобы различать два из них, вы захотите выяснить, выполняете ли вы развод с помощью одного пальца или простого MotionEvent.MOVE для кастрюли. Жесткий жест требует, чтобы пользователь превзошел предопределенную скорость. GestureDetector должен позаботиться об этом для вас.