1

我正在尝试实现一个“按钮”,它可以在单击和长按时临时更改背景。我实现了一个“可绘制/选择器”:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_pressed="true"
        android:drawable="@drawable/key_pressed" />
    <item
        android:drawable="@drawable/key_unpressed" />
</selector>

我还捕获了长按事件以将背景更改为其他内容:

@Override
public boolean onLongClick(View view) {
    view.setBackground(getDrawable(R.drawable.key_long_pressed));
    return true;
}

这样做会使背景粘住并且不会恢复。如果我注释掉“setBackground()”,释放按钮就会起作用。

想法?

我仍然想通过长按来更改背景。

4

2 回答 2

0

如果我正确理解您的意图,那么您希望在用户按下按钮后更改背景,并在用户释放按钮后将其恢复正常。要解决此问题,您有两个选择(恕我直言):

选项 1(简单、快速):

添加使用标准 Android 机制的涟漪效应。请参阅此问题的答案:使用按钮背景颜色向我的按钮添加波纹效果?

选项 2(更多开销,需要更长的时间,需要编码):

AndroidonLongClick()在用户释放按钮时调用,因此在长按结束时。

长按定义为运动事件ACTION_DOWN和之间的时间(可配置) ACTION_UP,因此按下按钮和释放按钮。因此,您的函数被调用ACTION_UP并且从未被第二次调用(Android 不会调用函数 on ACTION_DOWN),因此背景颜色不会恢复。

如果您想更改背景,则需要在代码中实现并设置GestureDetector和处理ACTION_DOWNand ACTION_UP。您可以GestureDetector.SimpleOnGestureListener只使用和覆盖您的代码需要的那些运动事件。

GestureDetector.SimpleOnGestureListener.onDown()您的代码中设置背景, GestureDetector.SimpleOnGestureListener.onLongPress()恢复背景颜色。请注意,此背景更改也会出现在所有其他按钮操作上,因为每个按钮操作都以onDown. 您还需要恢复正常颜色以进行其他操作。

于 2020-08-26T20:30:07.263 回答
0

删除此代码

@Override
public boolean onLongClick(View view) {
    view.setBackground(getDrawable(R.drawable.key_long_pressed));
    return true;
}

并将此 lin 放在 XML 上的按钮上

android:background="@drawable/key_long_pressed"
于 2020-08-26T19:51:20.333 回答