Android setOnTouchListener

1

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

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

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

Теги:
gesture

2 ответа

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 ( github.com/sephiroth74/ImageViewZoom )
1

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

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

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

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

  • 0
    эй, спасибо за совет, но на самом деле это то, что я пытался сделать. и я не хотел связываться с указателем вниз, чтобы удерживать прошлое значение. а также иметь экземпляр моего ImageView внутри моего ViewPager. Поэтому я нашел другой способ сделать это. опубликую мой ответ, чтобы все могли его увидеть. в любом случае спасибо
Сообщество Overcoder
Наверх
Меню