具有选定状态的Android ImageButton?

Jor*_*ren 81 android button imagebutton

如果我使用带有选择器的ImageButton作为其背景,是否有一种状态我可以改变它会改变它的外观?现在我可以让它在按下时更改图像,但似乎没有"突出显示"或"选中"或类似状态,这让我可以随意切换其外观.

这是我的XML; 它只会在按下时改变外观.

 <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" />
Run Code Online (Sandbox Code Playgroud)

jos*_*hrl 203

这对我有用:

<?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>
Run Code Online (Sandbox Code Playgroud)

然后在java中:

//assign the image in code (or you can do this in your layout xml with the src attribute)
imageButton.setImageDrawable(getBaseContext().getResources().getDrawable(R.drawable....));

//set the click listener
imageButton.setOnClickListener(new OnClickListener() {

    public void onClick(View button) {
        //Set the button's appearance
        button.setSelected(!button.isSelected());

        if (button.isSelected()) {
            //Handle selected state change
        } else {
            //Handle de-select state change
        }

    }

});
Run Code Online (Sandbox Code Playgroud)

为了平滑过渡,您还可以提到动画时间:

<selector xmlns:android="http://schemas.android.com/apk/res/android" android:exitFadeDuration="@android:integer/config_mediumAnimTime">
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用,但我想补充一点,一个人应该在你的drawable文件夹中创建这个xml,如果你希望ImageButton在按下它时突出显示,你应该使用android:state_pressed而不是state_selected.此外,这个状态应该在没有状态的项目之上,因为它不是一般的状态. (3认同)
  • `注意:顺序是重要的(第一个匹配状态是渲染的东西)这确实有效但奇怪的是我没有得到为什么? (3认同)
  • 感谢关于订单的说明.起初我完全错过了它. (3认同)
  • 在没有任何状态属性的情况下,该项目将匹配任何状态.因此,请将选择器中的第二项视为"全部捕获"状态. (2认同)
  • 顺序并不重要你只需要确保你提供`android:state_selected ="false"`和默认的! (2认同)
  • 感谢您在结束时建议淡入淡出动画.额外的东西...... (2认同)

vok*_*lam 17

ToggleImageButton它实现了Checkable接口和支持OnCheckedChangeListener以及android:checkedxml属性:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

RES /值/ attrs.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="ToggleImageButton">
        <attr name="android:checked" />
    </declare-styleable>
</resources>
Run Code Online (Sandbox Code Playgroud)

  • 我怎么用呢?我按照以下说明操作:http://developer.android.com/training/custom-views/create-view.html但我无法使其正常工作. (2认同)
  • 谢谢!请注意,使用`state_checked`的选择器不能使用它,你必须使用`state_selected`. (2认同)

And*_*rás 9

没有更多图像的最佳方法:

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;
        }
    });
}
Run Code Online (Sandbox Code Playgroud)