我有三张图片,分别是button_focused
, button_pressed
, 和 button_normal
。当我按下按钮时,会显示button_pressed
图片,并执行与按钮按下相关的操作。
当我停止按下按钮时,操作还在继续,但是按钮会显示回button_normal
图片。
我该如何设置按钮在整个操作期间一直显示button_pressed
图片,然后再重置为button_normal
图片?
谢谢您的时间。
我有三张图片,分别是button_focused
, button_pressed
, 和 button_normal
。当我按下按钮时,会显示button_pressed
图片,并执行与按钮按下相关的操作。
当我停止按下按钮时,操作还在继续,但是按钮会显示回button_normal
图片。
我该如何设置按钮在整个操作期间一直显示button_pressed
图片,然后再重置为button_normal
图片?
谢谢您的时间。
I used a function like
void setHighlighted(boolean highlight) {
button.setBackgroundResource( highlight
? R.drawable.bbg_pressed
: R.drawable.button_background);
}
其中button_background是在button_backgroung.xml
中定义的选择器:
<?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/bbg_pressed"></item>
<item android:state_focused="true" android:drawable="@drawable/bbg_selected"></item>
<item android:drawable="@drawable/bbg_normal"></item>
</selector>
也就是说,这段代码不会干扰Android框架所使用的按下状态;相反,它会改变背景,使按钮看起来被按下了。
如果您只需要一个两个状态的按钮,以下内容可能会更清晰:
您不需要自己的 button.xml
。您可以使用 Android 的普通 Button
。
button.setPressed(true)
不起作用,因为当您松开按钮时,Android 会将其重置。尝试先设置另一个按钮的 setPressed
状态以查看效果。
这意味着,要在同一个按钮上使用它,必须进行延迟设置。以下是一个可行的示例。当然,通过长 ID(18..)更改背景的方法也有效。
private final Handler mHandler = new Handler();
rootView.findViewById(R.id.yourButton).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
boolean pressed = false;
if (v.getTag() instanceof Boolean)
pressed = (boolean) v.getTag();
final boolean newPressed = !pressed;
// setTag to store state
v.setTag(newPressed);
final View vRun = v;
Runnable run = new Runnable() {
@Override
public void run() {
vRun.setPressed(newPressed);
}
};
mHandler.post(run);
// mHandler.postDelayed(run, 5);
}
});
作为另一种选择,我想提供我的两分意见。不要使用button.setPressed,因为用户松开按钮后会失去选择器的状态,而是可以使用setSelected(true)。只需确保在完成操作后返回setSelected(false)。
btn.setOnClickListener( view -> {
view.setSelected(true);
});
<item android:drawable="@drawable/btn_selected" android:state_selected="true"></item>
我使用了
NAME_OF_BUTTON.setImageResource(0xvalueofbutton_pressed image listed in R.java);
然后,当操作终止时,我复制了代码并插入了button_normal
的整数值。
我以前是用不同的方法做的,现在我找不到我的备份或代码的硬拷贝了。
再次感谢您的回复。
(buttonName).setPressed(true)
,并确保您已经保留了适当的 XML 文件来定义用于按下、聚焦等状态的可绘制对象。虽然这是一个老问题,但我认为我的方法比上面所有的方法都更简单。在按钮的onclick事件中:
thisButton
.getBackground()
.setColorFilter(getResources().getColor(R.color.colorAccent), PorterDuff.Mode.MULTIPLY);
thisButton.getBackground().clearColorFilter();