2012-06-25 2 views
1

Я прочитал несколько разных ответов для этого же вопроса, поэтому я не знаю, какой из них прав, тогда я решил снова спросить его. Попробуйте не ссылаться на другую ссылку в этом ответе. Если вы хотите сделать это, я буду ожидать немного дополнительного объяснения.Android setOnTouchListener

Мой вопрос: У меня есть ImageView внутри ViewPager, мой ImageView имеет некоторые жесты обнаружения (масштабирования и панорамирования), и я использую по умолчанию ViewPager, который проведите обнаружение по умолчанию. Как работает цепочка событий onTouch? Самый низкий вид в моей иерархии всегда будет включен onTouch, и если метод вернет false, родительский элемент обработает его? Возможно, наоборот?

Я спрашиваю, потому что я есть ImageView, который имеет жесты влево и вправо, а когда я на краю изображения, я должен послать событие к родителю (а ViewPager), чтобы справиться с разбиение на страницы. любой дальнейший совет в том, как это сделать, это будет действительно оценено.

ответ

2

Итак, я справился с несколькими касаниями в представлениях детей 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); 
    } 
} 

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.1_r1/android/support/v4/view/ViewPager.java#ViewPager.canScroll%28android.view.View%2Cboolean%2Cint%2Cint%2Cint%29

+0

Можете ли вы отправить метод canScroll() класса ImageViewTouch? Я предполагаю, что вы используете этот ImageViewTouch (https://github.com/sephiroth74/ImageViewZoom) – atermenji

1

Он работает противоположным образом ViewPager сначала использует события касания, затем ImageView получит его.

Я бы использовал onInterceptTouchEvent (MotionEvent ev) в пользовательском представлении Pager. В MotionEvent вы захотите проанализировать, сколько точек касания есть ev.getPointerCount().

Если у вас есть ev.getPointerCount() == 2, вы, вероятно, захотите сделать щепотку и масштабирование внутри ImageView.

Если у вас есть ev.getPointerCount() == 1, то вы, вероятно, намерены прокручивать страницы пейджера просмотра или выполнять панорамирование в ImageView. Чтобы различать два из них, вы захотите выяснить, выполняете ли вы развод с помощью одного пальца или простого MotionEvent.MOVE для кастрюли. Жесткий жест требует, чтобы пользователь превзошел предопределенную скорость. GestureDetector должен позаботиться об этом для вас.

+0

эй, спасибо за совет, но на самом деле тот, что я пытался сделать. и я не хотел связываться с указателем Down, чтобы удерживать прошлую ценность. а также экземпляр моего ImageView внутри моего ViewPager. Поэтому я нашел другой способ сделать это. опубликует мой ответ, чтобы все могли его увидеть. Спасибо anyways –

Смежные вопросы