В моем приложении я хочу добавить простую анимацию к кнопкам и другим представлениям, действующим как кнопки.
Для этого я устанавливаю пользовательский 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, поэтому они также получают небольшую мерцающую анимацию.
Почему это, и что более важно, как я могу предотвратить это раздражающее поведение?
Изменение: просто чтобы быть ясным. Соседи также регистрируются в одном экземпляре слушателя, но мои пальцы не трогают.
Проблема заключалась в использовании одного и того же экземпляра Animation для нескольких просмотров. Создание отдельных экземпляров для каждого вида устраняет проблему.
Представление, в котором вы зарегистрировали слушателя, затем должно только получить уведомление, а затем использовать следующий подход.
Вы можете явно проверить, что такое 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);
}