📜  Android中的自定义复选框(1)

📅  最后修改于: 2023-12-03 14:39:11.809000             🧑  作者: Mango

Android中的自定义复选框

Android中提供了自带的复选框控件CheckBox,但是我们有时候需要自定义复选框的样式,以满足我们的需求。本文将介绍如何在Android中自定义复选框。

1.使用自定义图片

我们可以使用自定义图片来替代默认的CheckBox样式。步骤如下:

1)首先,准备两张图片,一张表示未选中的状态,一张表示选中的状态。

2)在res/drawable目录下创建一个XML文件,命名为checkbox_style.xml,文件内容如下:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/checkbox_off" android:state_checked="false" />
    <item android:drawable="@drawable/checkbox_on" android:state_checked="true" />
</selector>

其中,@drawable/checkbox_off和@drawable/checkbox_on分别表示未选中和选中的状态的图片。

3)在布局文件中使用CheckBox控件,并将android:button属性设置为刚才创建的XML文件名:

<CheckBox
    android:id="@+id/checkbox"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="我是自定义复选框"
    android:button="@drawable/checkbox_style" />

这样就完成了自定义复选框的样式。

2.使用自定义View

我们也可以使用自定义View来实现复选框的效果。步骤如下:

1)创建一个自定义View,继承自View或者CheckBox控件:

public class MyCheckBox extends View {
    private Paint mPaint;
    private boolean mChecked = false;

    public MyCheckBox(Context context) {
        super(context);
        init();
    }

    public MyCheckBox(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public MyCheckBox(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    }

    public void setChecked(boolean checked) {
        mChecked = checked;
        invalidate();//重新绘制View
    }

    public boolean isChecked() {
        return mChecked;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int width = getWidth();
        int height = getHeight();
        int cx = width / 2;
        int cy = height / 2;
        int radius = Math.min(cx, cy);
        mPaint.setColor(Color.WHITE);
        mPaint.setStyle(Paint.Style.FILL);
        canvas.drawCircle(cx, cy, radius, mPaint);
        if (mChecked) {
            mPaint.setColor(Color.GREEN);
            canvas.drawCircle(cx, cy, radius * 0.6f, mPaint);
        }
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int width = MeasureSpec.getSize(widthMeasureSpec);
        int height = MeasureSpec.getSize(heightMeasureSpec);
        setMeasuredDimension(Math.min(width, height), Math.min(width, height));
    }
}

上面的代码中,我们重写了onDraw方法,在里面绘制了一个圆圈和一个选中状态的小圆圈。

2)在布局文件中使用刚才创建的自定义View:

<com.example.myapplication.MyCheckBox
    android:id="@+id/my_checkbox"
    android:layout_width="80dp"
    android:layout_height="80dp"
    android:clickable="true" />

在Activity中,我们可以通过setOnClickListener方法来监听自定义View的点击事件:

myCheckBox.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        if (myCheckBox.isChecked()) {
            myCheckBox.setChecked(false);
        } else {
            myCheckBox.setChecked(true);
        }
    }
});

这样就完成了自定义View实现复选框的样式。

总结

本文介绍了两种实现自定义复选框的方法,一是使用自定义图片,二是使用自定义View。对于简单的样式,我们可以选择第一种方法,对于复杂的样式,我们可以选择第二种方法。