具有选定状态的Android ImageButton?
如果我使用带有选择器的ImageButton作为背景,是否有一种状态可以改变,从而使其改变外观?现在,我可以让它改变图像时按下,但似乎没有“突出显示”或“选定”或类似的状态,让我随意切换它的外观 这是我的XML;它仅在按下时更改外观具有选定状态的Android ImageButton?,android,button,imagebutton,Android,Button,Imagebutton,如果我使用带有选择器的ImageButton作为背景,是否有一种状态可以改变,从而使其改变外观?现在,我可以让它改变图像时按下,但似乎没有“突出显示”或“选定”或类似的状态,让我随意切换它的外观 这是我的XML;它仅在按下时更改外观 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_focused="true" android:state_pres
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:state_pressed="false" android:drawable="@drawable/map_toolbar_details_selected" />
<item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/map_toolbar_details_selected" />
<item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/map_toolbar_details_selected" />
<item android:drawable="@drawable/map_toolbar_details" />
试试这个:
<item
android:state_focused="true"
android:state_enabled="true"
android:drawable="@drawable/map_toolbar_details_selected" />
同样对于颜色我也很成功
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_selected="true"
android:color="@color/primary_color" />
<item
android:color="@color/secondary_color" />
</selector>
这对我很有用:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- NOTE: order is important (the first matching state(s) is what is rendered) -->
<item
android:state_selected="true"
android:drawable="@drawable/info_icon_solid_with_shadow" />
<item
android:drawable="@drawable/info_icon_outline_with_shadow" />
</selector>
对于平滑过渡,您还可以提及动画时间:
<selector xmlns:android="http://schemas.android.com/apk/res/android" android:exitFadeDuration="@android:integer/config_mediumAnimTime">
在没有更多图像的情况下执行此操作的最佳方法:
public static void buttonEffect(View button){
button.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
v.getBackground().setColorFilter(0xe0f47521,PorterDuff.Mode.SRC_ATOP);
v.invalidate();
break;
}
case MotionEvent.ACTION_UP: {
v.getBackground().clearColorFilter();
v.invalidate();
break;
}
}
return false;
}
});
}
ToggleImageButton
实现了checked
界面,支持OnCheckedChangeListener
和android:checked
xml属性:
public class ToggleImageButton extends ImageButton implements Checkable {
private OnCheckedChangeListener onCheckedChangeListener;
public ToggleImageButton(Context context) {
super(context);
}
public ToggleImageButton(Context context, AttributeSet attrs) {
super(context, attrs);
setChecked(attrs);
}
public ToggleImageButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setChecked(attrs);
}
private void setChecked(AttributeSet attrs) {
TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.ToggleImageButton);
setChecked(a.getBoolean(R.styleable.ToggleImageButton_android_checked, false));
a.recycle();
}
@Override
public boolean isChecked() {
return isSelected();
}
@Override
public void setChecked(boolean checked) {
setSelected(checked);
if (onCheckedChangeListener != null) {
onCheckedChangeListener.onCheckedChanged(this, checked);
}
}
@Override
public void toggle() {
setChecked(!isChecked());
}
@Override
public boolean performClick() {
toggle();
return super.performClick();
}
public OnCheckedChangeListener getOnCheckedChangeListener() {
return onCheckedChangeListener;
}
public void setOnCheckedChangeListener(OnCheckedChangeListener onCheckedChangeListener) {
this.onCheckedChangeListener = onCheckedChangeListener;
}
public static interface OnCheckedChangeListener {
public void onCheckedChanged(ToggleImageButton buttonView, boolean isChecked);
}
}
res/values/attrs.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ToggleImageButton">
<attr name="android:checked" />
</declare-styleable>
</resources>
在
res/drawable
文件夹中创建XML文件。例如,“btn_image.xml”:
嗯,似乎没用。我用的是复合按钮。是否存在特定于该类型按钮的开/关状态?是的,使用ImageButton调用checked see isChecked(),跟踪所选状态似乎有点困难。如果您想要切换功能,您应该使用切换按钮。我如何使用它?我按照中的说明做了:但是我不能让它工作。谢谢!请注意,选中了
state_
的选择器不适用于此,但您必须使用state_selected
。这对我很有效,但我想补充一点,应该在您的可绘制文件夹中创建此xml,如果您希望ImageButton在按下时高亮显示,您应该使用android:state\u pressed而不是state\u selected。此外,此状态应该位于没有状态的项之上,因为它不是一般的状态。注意:顺序很重要(第一个匹配的状态是呈现的状态)
这确实有效,但奇怪的是,我不明白为什么?在没有任何状态属性的情况下,该项将匹配任何状态。因此将选择器中的第二个项视为“全部捕获”状态。顺序并不重要。您只需要确保为android:state_selected=“false”提供默认的状态!我如何在小部件中执行相同的操作?我有一个按钮,但似乎不知道如何执行。您可以使用getResources().getColor(R.color.lightblue)从xml中着色。@András需要再按住按钮一点。你知道为什么吗?
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ToggleImageButton">
<attr name="android:checked" />
</declare-styleable>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/bg_state_1"
android:state_pressed="true"
android:state_selected="true"/>
<item android:drawable="@drawable/bg_state_2"
android:state_pressed="true"
android:state_selected="false"/>
<item android:drawable="@drawable/bg_state_selected"
android:state_selected="true"/>
<item android:drawable="@drawable/bg_state_deselected"/>
</selector>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#ccdd00"/>
<corners android:radius="5dp"/>
</shape>
<ImageView
android:id="@+id/image"
android:layout_width="50dp"
android:layout_height="50dp"
android:adjustViewBounds="true"
android:background="@drawable/btn_image"
android:padding="10dp"
android:scaleType="fitCenter"
android:src="@drawable/star"/>
image.setSelected(!image.isSelected());
if (iv_new_pwd.isSelected()) {
iv_new_pwd.setSelected(false);
Log.d("mytag", "in case 1");
edt_new_pwd.setInputType(InputType.TYPE_CLASS_TEXT);
} else {
Log.d("mytag", "in case 1");
iv_new_pwd.setSelected(true);
edt_new_pwd.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
}