本来checkBox是可以使用的,但是现在新需求里要增加一个状态是disabled,disabled状态要展示特定的图片,这个checkBox解决不了,而且状态也不好控制,所以干脆自己封装一个算了。
先定义一个自定义attrs:
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="ImageViewCheckBox"> <attr name="default_state" format="integer" /> <attr name="checked_bkg" format="reference" /> <attr name="unchecked_bkg" format="reference" /> <attr name="checked_disabled" format="reference" /> </declare-styleable> </resources>然后写这个自定义的imageView
package com.amuro.main; import com.amuro.imageviewcheckboxtest.R; import android.content.Context; import android.content.res.TypedArray; import android.util.AttributeSet; import android.view.View; import android.widget.ImageView; public class ImageViewCheckBox extends ImageView { public static final int CHECK_STATE_DISABLED = 0; public static final int CHECK_STATE_UNCHECKED = 1; public static final int CHECK_STATE_CHECKED = 2; private int check_bkg_id; private int uncheck_bkg_id; private int disable_check_bkg_id; private int checkState; public ImageViewCheckBox(Context context) { this(context, null); } public ImageViewCheckBox(Context context, AttributeSet attrs) { this(context, attrs, 0); } public ImageViewCheckBox(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(attrs); } private void init(AttributeSet attrs) { TypedArray t = getContext().obtainStyledAttributes(attrs, R.styleable.ImageViewCheckBox); checkState = t.getInteger(R.styleable.ImageViewCheckBox_default_state, CHECK_STATE_UNCHECKED); check_bkg_id = t.getResourceId(R.styleable.ImageViewCheckBox_checked_bkg, 0); uncheck_bkg_id = t.getResourceId(R.styleable.ImageViewCheckBox_unchecked_bkg, 0); disable_check_bkg_id = t.getResourceId(R.styleable.ImageViewCheckBox_checked_disabled, 0); setBkgByCheckState(); setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { changeState(); } }); t.recycle(); } public void changeState() { if(checkState == CHECK_STATE_DISABLED) { return; } if(checkState == CHECK_STATE_UNCHECKED) { checkState = CHECK_STATE_CHECKED; } else if(checkState == CHECK_STATE_CHECKED) { checkState = CHECK_STATE_UNCHECKED; } setBkgByCheckState(); notifyListner(); } public void setCheckDisabled() { this.checkState = CHECK_STATE_DISABLED; setBkgByCheckState(); } private void setBkgByCheckState() { if(checkState == CHECK_STATE_UNCHECKED) { setBackgroundResource(uncheck_bkg_id); } else if(checkState == CHECK_STATE_DISABLED) { setBackgroundResource(disable_check_bkg_id); } else { setBackgroundResource(check_bkg_id); } } public interface OnCheckStateChangedListener { public void onCheckStateChanged(boolean isChecked); } private OnCheckStateChangedListener listener; public void setOnCheckStateChangedListener(OnCheckStateChangedListener listener) { this.listener = listener; } private void notifyListner() { if(this.listener != null) { if(checkState == CHECK_STATE_UNCHECKED) { this.listener.onCheckStateChanged(false); } else if(checkState == CHECK_STATE_CHECKED) { this.listener.onCheckStateChanged(true); } } } }imageView直接封装了click事件,各种状态下对应的图片都可直接从配置文件中读取,用户点击的时候直接进行图片的切换模拟checkBox效果,disable状态下changeState方法将直接无效。回调的形式和checkbox一样,使用者会感觉很亲切,哈哈。
最后使用的时候在xml里配置一下这个imageView就可以了:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res/com.amuro.imageviewcheckboxtest" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <com.amuro.main.ImageViewCheckBox android:id="@+id/ivcb" android:layout_width="40dp" android:layout_height="40dp" app:default_state="1" app:checked_bkg="@drawable/paysdk2_icon_virtual_ticket_selected" app:unchecked_bkg="@drawable/paysdk2_icon_virtual_ticket_unselected" app:checked_disabled="@drawable/paysdk2_icon_virtual_ticket_select_disabled" /> </LinearLayout>以上,感谢收看~