首页 文章

具有选定状态的Android ImageButton?

提问于
浏览
75

如果我使用带有选择器的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" />

5 回答

  • 9

    这对我有用:

    <?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>
    

    然后在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
            }
    
        }
    
    });
    

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

    <selector xmlns:android="http://schemas.android.com/apk/res/android" android:exitFadeDuration="@android:integer/config_mediumAnimTime">
    
  • 2

    ToggleImageButton ,它实现 Checkable 接口并支持 OnCheckedChangeListenerandroid: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 /值/ attrs.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <declare-styleable name="ToggleImageButton">
            <attr name="android:checked" />
        </declare-styleable>
    </resources>
    
  • 195

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

    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;
            }
        });
    }
    
  • 2

    试试这个:

    <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>
    
  • 15

    res/drawable 文件夹中创建XML文件 . 例如,"btn_image.xml":

    <?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>
    

    您可以组合您喜欢的文件,例如,将“bg_state_1”更改为“bg_state_deselected”,将“bg_state_2”更改为“bg_state_selected” .

    在任何这些文件中,您可以编写如下内容:

    <shape xmlns:android="http://schemas.android.com/apk/res/android"
           android:shape="rectangle">
        <solid android:color="#ccdd00"/>
        <corners android:radius="5dp"/>
    </shape>
    

    在布局文件中创建具有以下属性的ImageView或ImageButton:

    <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());
    

相关问题