Android StateListDrawable остается нажатым после MultiTouch - PullRequest
2 голосов
/ 29 декабря 2011

У меня есть представление списка, в котором элементы списка имеют следующий фон для рисования

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/transparent" />
    <item android:state_pressed="true"
    android:drawable="@drawable/collection_item_gradient" />
</selector>

Когда элемент списка нажат, он применяет градиент. Однако, если пользователь затем инициирует событие мультитача (скажем, прикладывая дополнительный палец вниз где-нибудь за пределами представления списка), возможно, что элемент списка остается в нажатом состоянии, пока другое представление касания не будет получено представлением списка.

Есть ли способ обойти это?

1 Ответ

1 голос
/ 29 декабря 2011

Это в некоторой степени зависит от того, чего вы хотите достичь ...

Если вы хотите отобразить третий тип фона, когда у пользователя два пальца вниз, нет состояния рисования, на которое вы можете ссылаться напрямуювыполнить.Вам нужно будет совместить одно из существующих состояний, которое не часто используется в сенсорном режиме (например, выбранное состояние), и реализовать настраиваемый обработчик касания для объекта элемента списка, чтобы установить это состояние.Например, реализуйте onTouchEvent() в представлении каждого элемента списка (или добавьте onTouchListener(), если у вас нет пользовательского класса), найдите событие ACTION_POINTER_DOWN, чтобы сообщить вам, что второй палец опустился, и вызовите setSelected() в представлении для запуска рисования, которое вы установили для android:state_selected в вашем <selector>.

Если вы просто хотите очистить состояние в этом случае, вы можете отменить событие касания, когда более чемодин палец обнаружен.В этом случае вы пытаетесь настроить метод ListView.onInterceptTouchEvent() для поиска события ACTION_PONTER_DOWN и возврата true.Это научит ListView украсть касание обратно от его дочернего элемента вторым пальцем, что отменит нажатое состояние элемента списка.Обязательно перезвоните super в этом случае, чтобы не нарушать всю существующую логику, ListView используемую для прокрутки и т. Д.

Остерегайтесь случаев, когда существующая реализация AbsListView может получитьпо-вашему здесь.Например, текущая реализация onIntercepTouchEvent() ищет ACTION_POINTER_UP для переключения основного сенсорного пальца с первого на второй.Это поведение может вызвать странные артефакты в вашей настройке, если вы не знаете об этом.

HTH.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...