【问题标题】:Android StateListDrawable Remains Pressed After MultiTouch多点触控后,Android StateListDrawable 保持按下状态
【发布时间】:2012-01-29 12:59:50
【问题描述】:
我有一个列表视图,其中列表项具有以下可绘制背景
<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>
当列表项被按下时,它会应用渐变。但是,如果用户随后启动了多点触控事件(例如,通过在列表视图之外的某处按下额外的手指),则列表项可能会保持按下状态,直到列表视图接收到另一个触摸事件。
有没有办法解决这个问题?
【问题讨论】:
标签:
android
list
listview
state
listitem
【解决方案1】:
这在一定程度上取决于您要完成的任务...
如果您希望在用户两根手指向下时显示第三种背景类型,则没有可直接引用来完成的可绘制状态。您将不得不合作在触摸模式下不经常使用的现有状态之一(例如选定状态),并在列表项的对象上实现自定义触摸处理程序以设置该状态。例如,在每个列表项的视图中实现onTouchEvent()(如果您没有自定义类,则添加onTouchListener()),查找ACTION_POINTER_DOWN 事件告诉您第二根手指向下,然后调用@视图上的 987654324@ 以触发您在 <selector> 中为 android:state_selected 设置的可绘制对象。
如果你只是想在这种情况下清除状态,你可以在检测到多根手指时取消触摸事件。在这种情况下,您正在考虑自定义ListView.onInterceptTouchEvent() 方法以查找ACTION_PONTER_DOWN 事件并返回true。这将教ListView 用第二根手指从其子项中窃取触摸,这将取消列表项的按下状态。在这种情况下,请确保回调到 super,这样您就不会破坏 ListView 用于滚动等的所有现有逻辑。
当心现有的AbsListView 实现可能会妨碍您。例如,onIntercepTouchEvent() 的当前实现会查找ACTION_POINTER_UP,以便将主触摸手指从第一个手指切换到第二个手指。如果您不知道,此行为可能会在您的自定义中导致奇怪的伪影。
HTH。