Почему мой onTouchListener вызывается для соседних представлений?

1

В моем приложении я хочу добавить простую анимацию к кнопкам и другим представлениям, действующим как кнопки.

Для этого я устанавливаю пользовательский onTouchListener ко всем представлениям и вызываю startAnimation на них.

Мой метод onTouch выглядит следующим образом:

public boolean onTouch(View v, MotionEvent event) {

    // Only show animation when enabled.
    if (v.isEnabled()) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            v.startAnimation(shrink);
            break;
        case MotionEvent.ACTION_UP:
            v.startAnimation(grow);
            break;
        }
    }
    return v.onTouchEvent(event);
}

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

Однако по какой-то причине другие кнопки, которые находятся рядом с нажатой кнопкой, также получают событие UP, поэтому они также получают небольшую мерцающую анимацию.

Почему это, и что более важно, как я могу предотвратить это раздражающее поведение?

Изменение: просто чтобы быть ясным. Соседи также регистрируются в одном экземпляре слушателя, но мои пальцы не трогают.

  • 0
    Возможно, стоит добавить оператор ведения журнала в этот метод, распечатав идентификатор представления. Также выведите пару идентификаторов кандидатов в методе onCreate. То, что вы увидите, вероятно, не является сюрпризом, но оно, по крайней мере, подтвердит, что это событие запускается как для ожидаемого, так и для «соседнего» представления.
Теги:
events
touch

2 ответа

0
Лучший ответ

Проблема заключалась в использовании одного и того же экземпляра Animation для нескольких просмотров. Создание отдельных экземпляров для каждого вида устраняет проблему.

0

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

Вы можете явно проверить, что такое id из View, а затем запускать только анимацию.

public boolean onTouch(View v, MotionEvent event) {

    if (v.getId() == R.id.desired_view_id) {
        // Only show animation when enabled.
        if (v.isEnabled()) {
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                v.startAnimation(shrink);
                break;
            case MotionEvent.ACTION_UP:
                v.startAnimation(grow);
                break;
            }
        }
    }
    return v.onTouchEvent(event);
}
  • 0
    Другие представления также зарегистрированы для того же слушателя. Однако это происходит даже тогда, когда я их не трогаю.
  • 0
    Именно так!! метод, который вы написали, будет применим ко всем представлениям, поэтому вам нужно по идентификатору проверять, какое представление вызвало этот метод… используйте фрагмент, который я опубликовал выше.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню