在MultiTouch之后仍然按下Android StateListDrawable

时间:2011-12-28 23:02:59

标签: android list listview state listitem

我有一个列表视图,其中列表项具有以下背景可绘制

<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 个答案:

答案 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。