Подтвердить что ты не робот

Обнаружить бегущий жест над предметами, которые можно щелкнуть

Представьте макет с 4 кнопками

 _______________________________
|              |                |
|      A       |       B        |
|______________|________________|
|              |                |
|      C       |       D        |
|______________|________________|

Я хотел бы обнаружить жестом fling по всему макету, но когда запуск не запускается, кнопка не обнаруживается.

Я использую:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    gesturedetector= new GestureDetector(this, this);

    findViewById(R.id.touchContainer).setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            Log.e("","TouchEvent");
            return gesturedetector.onTouchEvent(event);
        }
    });
}

Это, когда нет элементов, которые можно щелкнуть, но не удастся, если запуск запускается над кликабельным элементом.

Как я могу это решить? Предлагая щедрость 50 баллов за полный рабочий ответ

4b9b3361

Ответ 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 на один и тот же объект детектирования жестов.