Ответ 1
Один из способов, которым я достиг этого, - переопределить следующий метод:
public boolean onInterceptTouchEvent(MotionEvent event){
super.onInterceptTouchEvent(event);
...
Вы можете переопределить этот метод в своем контейнере макета (например, ViewGroup или все, что вы держите с кнопками), и продолжать возвращать false
из него, чтобы "перехватывать" события касания, которые потребляются дочерним View
(т.е. ваши кнопки). В рамках этого переопределенного метода вы можете вызвать свой объект детектирования жестов с помощью MotionEvent
s. Этот метод также "видит" события, которые также нацелены на ViewGroup
, что означает - если я правильно помню - вам нужно было бы только вызвать ваш детектор жестов из этого метода, и при этом детектор жестов "увидит", все события, независимо от того, есть ли они над кнопками или нет. Поэтому, если вы перетаскиваете палец, начиная с кнопки, а затем заканчивая в какой-то момент фона макета, детектор жестов должен видеть весь салфетки. Вам не нужно было бы подавать детектор жестов событиями из макета onTouchEvent()
, потому что он их уже видел.
Второй способ:
Я просто посмотрел на свой проект, где использовал это, и понял, что я переключился на другой способ сделать это. Фактически я создал весь мой дочерний View
, чтобы родительский Activity
(или содержащий ViewGroup
) мог зарегистрировать один и тот же объект детектирования жеста со всеми этими дочерними View
(каждый из моих специальных View
имеют метод, называемый registerGestureDetector()
). Затем, в переопределенном 'onTouchEvent()' в моем дочернем View
s, я передаю MotionEvent
в детектор жестов, который был зарегистрирован с этим View
. Другими словами, родительский макет ViewGroup
и все дочерние элементы View
просто используют один и тот же детектор жестов.
Я понимаю, что это может показаться чересчур сложным и необязательным, учитывая, что это можно сделать с помощью onInterceptTouchEvent()
, но мое приложение имеет дело с довольно сложными правилами относительно того, как мой View
должен реагировать на события и жесты касания, и это позволило мне применить некоторую дополнительную логику, которая мне нужна для моего приложения. Тем не менее, оба этих метода, которые я использовал, используют одну и ту же основную задачу здесь: направить тег MotionEvent
, который нацелил различные View
на один и тот же объект детектирования жестов.