Checkable ImageView
Does anybody know if it possible to make ImageView checkable. I try to use State-list drawable resource in my project where I define pictures for my ImageView check states, but there is no property to make ImageView checkable, only clickable.
Maybe 开发者_开发问答anybody knows a way to solve this problem?
Use this custom ImageView implementation (taken from here) :
public class CheckableImageView extends ImageView implements Checkable {
private boolean mChecked;
private static final int[] CHECKED_STATE_SET = { android.R.attr.state_checked };
public CheckableImageView(final Context context, final AttributeSet attrs) {
super(context, attrs);
}
@Override
public int[] onCreateDrawableState(final int extraSpace) {
final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
if (isChecked())
mergeDrawableStates(drawableState, CHECKED_STATE_SET);
return drawableState;
}
@Override
public void toggle() {
setChecked(!mChecked);
}
@Override
public boolean isChecked() {
return mChecked;
}
@Override
public void setChecked(final boolean checked) {
if (mChecked == checked)
return;
mChecked = checked;
refreshDrawableState();
}
}
EDIT: Updated, Kotlin solution:
class CheckableImageView : AppCompatImageView, Checkable {
private var mChecked = false
constructor(context: Context) : super(context) {}
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {}
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {}
override fun onCreateDrawableState(extraSpace: Int): IntArray {
val drawableState = super.onCreateDrawableState(extraSpace + 1)
if (isChecked) mergeDrawableStates(drawableState, CHECKED_STATE_SET)
return drawableState
}
override fun toggle() {
isChecked = !mChecked
}
override fun isChecked(): Boolean {
return mChecked
}
override fun setChecked(checked: Boolean) {
if (mChecked == checked) return
mChecked = checked
refreshDrawableState()
}
companion object {
private val CHECKED_STATE_SET = intArrayOf(android.R.attr.state_checked)
}
}
Instead of making an ImageView checkable you can set a state list drawable as background for a checkbox which will automatically flip the images.
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checkable="true" android:drawable="@drawable/icon_pressed" /> <!-- pressed -->
<item android:state_checked="true" android:drawable="@drawable/icon_focused" /> <!-- focused -->
<item android:drawable="@drawable/icon_default" /> <!-- default -->
</selector>
I implements OnClickListener from android developer's code for direct checking.
public class CheckableImageView extends ImageView implements Checkable, View.OnClickListener {
private boolean mChecked;
private static final int[] CHECKED_STATE_SET = { android.R.attr.state_checked };
public CheckableImageView(final Context context, final AttributeSet attrs) {
super(context, attrs);
setOnClickListener(this);
}
@Override
public int[] onCreateDrawableState(final int extraSpace) {
final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
if (isChecked())
mergeDrawableStates(drawableState, CHECKED_STATE_SET);
return drawableState;
}
@Override
public void toggle() {
setChecked(!mChecked);
}
@Override
public boolean isChecked() {
return mChecked;
}
@Override
public void setChecked(final boolean checked) {
if (mChecked == checked)
return;
mChecked = checked;
refreshDrawableState();
}
@Override
public void onClick(View v) {
toggle();
}
}
If you want change check state while clicking on ImageView, change "extend ImageView" to CompoundButton.
public class CheckableImageView extends CompoundButton {
public CheckableImageView(Context context) {
super(context);
}
public CheckableImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
private static final int[] CheckedStateSet = {android.R.attr.state_checked};
public void setChecked(boolean b) {
boolean oldState = isChecked();
super.setChecked(b);
if (b != oldState) {
refreshDrawableState();
}
}
@Override
public int[] onCreateDrawableState(int extraSpace) {
final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
if (isChecked()) {
mergeDrawableStates(drawableState, CheckedStateSet);
}
return drawableState;
}
@Override
protected void drawableStateChanged() {
super.drawableStateChanged();
invalidate();
}
}
this what i used in my app
public class MainActivity extends Activity implements OnClickListener {
private boolean paused = false;
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.imageview_pause:
paused = !paused;
if (paused) {
btn_pause.setBackgroundResource(R.drawable.pause_key_pressed);
}else{
btn_pause.setBackgroundResource(R.drawable.pause_key);
}
break;
}
}
}
精彩评论