【问题标题】: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@ 以触发您在 &lt;selector&gt; 中为 android:state_selected 设置的可绘制对象。

    如果你只是想在这种情况下清除状态,你可以在检测到多根手指时取消触摸事件。在这种情况下,您正在考虑自定义ListView.onInterceptTouchEvent() 方法以查找ACTION_PONTER_DOWN 事件并返回true。这将教ListView 用第二根手指从其子项中窃取触摸,这将取消列表项的按下状态。在这种情况下,请确保回调到 super,这样您就不会破坏 ListView 用于滚动等的所有现有逻辑。

    当心现有的AbsListView 实现可能会妨碍您。例如,onIntercepTouchEvent() 的当前实现会查找ACTION_POINTER_UP,以便将主触摸手指从第一个手指切换到第二个手指。如果您不知道,此行为可能会在您的自定义中导致奇怪的伪影。

    HTH。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-01
      • 2017-12-25
      • 1970-01-01
      • 2014-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多