我有一个列表视图,其中列表项具有以下背景可绘制
<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>
按下列表项时,它会应用渐变。然而,如果用户然后发起多点触摸事件(例如通过在列表视图之外的某处放置另外的手指),则列表项可能保持在按下状态直到列表视图接收到另一触摸事件。
有解决方法吗?
答案 0 :(得分:1)
这在某种程度上取决于你想要完成的事情......
如果您希望在用户双指向下时显示第三种背景类型,则没有可以直接引用以完成的可绘制状态。您必须合作在触摸模式中不常使用的现有状态之一(例如所选状态),并在列表项的对象上实现自定义触摸处理程序以设置该状态。例如,在每个列表项的视图中实现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。