android - "Press and hold"Android 上的按钮需要使用 onTouchListener 更改状态(自定义 XML 选择器)

标签 android selector ontouchlistener onclicklistener

我有一个按钮图形,它需要具有“按住”功能,所以我没有使用 onClickListener,而是使用 onTouchListener 以便应用可以使用react

 MotionEvent.ACTION_DOWN,

 MotionEvent.ACTION_UP

根据触发这两个事件的速度,我可以在两者之间运行“pressAndHoldHandler”。

总之,长话短说:我在同一个应用程序中有许多不需要按住功能的“基本”按钮,因此它们使用的是 onClickListener。

这些按钮中的每一个都使用自己的 XML 选择器文件以图形方式进行了自定义:

<?xml version="1.0" encoding="UTF-8"?>
<selector
    xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:state_enabled="false"
        android:drawable="@drawable/btn_chicken_off" />

    <item
        android:state_enabled="true"
        android:state_pressed="true"
        android:drawable="@drawable/btn_chicken_s3" />

    <item
        android:state_enabled="true"
        android:state_focused="true"
        android:drawable="@drawable/btn_chicken_s2" />

    <item
        android:state_enabled="true"
        android:drawable="@drawable/btn_chicken_off" />

</selector>

所以,这里的问题是:上面的选择器没有被 onTouchListener 访问。只有 onClickListener 会通过它自己的方法的 onClick() 部分引入状态更改,因此这些“按住”按钮永远不会更改状态。用户的反馈非常糟糕。

我目前正在通过执行以下操作在 ACTION_DOWN 和 ACTION_UP 的 switch case 中强制执行上述操作:

if (action == MotionEvent.ACTION_DOWN) {
    btn_chicken.setBackgroundResource(R.drawable.btn_chicken_s3);
}
else
    if (action == MotionEvent.ACTION_UP) {
        btn_chicken.setBackgroundResource(R.drawable.btn_chicken_off);
    }

但这似乎是一个 hack,它缺少“专注但不按下”阶段。

以前有人绊倒过吗?

最佳答案

使用 view.setPressed()自己模拟按下行为的函数。

您可能希望在获得 ACTION_DOWN 时启用 Pressed 状态事件并在收到 ACTION_UP 时禁用它事件。

此外,最好禁用它以防用户滑出按钮。 catch ACTION_OUTSIDE事件,如下例所示:

@Override
public boolean onTouch(View v, MotionEvent event) {

    switch (event.getAction() & MotionEvent.ACTION_MASK) {

    case MotionEvent.ACTION_DOWN:
        v.setPressed(true);
        // Start action ...
        break;
    case MotionEvent.ACTION_UP:
    case MotionEvent.ACTION_OUTSIDE:
    case MotionEvent.ACTION_CANCEL:
        v.setPressed(false);
        // Stop action ...
        break;
    case MotionEvent.ACTION_POINTER_DOWN:
        break;
    case MotionEvent.ACTION_POINTER_UP:
        break;
    case MotionEvent.ACTION_MOVE:
        break;
    }

    return true;
}

关于android - "Press and hold"Android 上的按钮需要使用 onTouchListener 更改状态(自定义 XML 选择器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12590169/

相关文章:

android - Google 很长时间没有在 Play Store 中更新我的应用程序,超过 3 周

jquery - 如何在页面加载jquery时获取表单ID

ios - 自定义 UIView 子类中的 UIButton 不触发操作事件

Android OnTouch 事件众多对象

java - Android 点击并按住删除项目

android - 要添加哪些代码才能使图像移动?

带有 Realm DB 的 Android 实现,主 UI 错误上的事务

java - 从 ArrayList 中检索样本

android - 将数据从移动应用程序发送到 Android Wear 延迟

jquery - 在 jQuery 中选择类中的下一个实例