Warm tip: This article is reproduced from serverfault.com, please click

其他-Android,使用已检查和未检查的案例创建四舍五入的自定义视图

(其他 - Android, create rounded custom view with checked and unchecked cases)

发布于 2020-12-22 13:03:58

我需要创建一个自定义图像视图以通过设计选择颜色。当用户单击圆圈时,应显示带有勾号的内部白色圆圈,如下例所示:

在此处输入图片说明

否则,它应该只是带有某种颜色(未选中状态)的圆形,如下所示:

在此处输入图片说明

主要问题是,我不知道如何创建一个带有内部圆并保持以编程方式设置颜色的能力的选择器。

我可以设置简单的圆形形状,例如:

<de.hdodenhof.circleimageview.CircleImageView
    android:id="@+id/circle_crop"
    android:layout_width="32dp"
    android:layout_height="32dp"
    android:layout_gravity="center"
    android:src="@android:color/holo_red_dark" />

如何修改它以在选中状态(当用户单击它时)内打勾以设置白色圆圈?

Questioner
Michael Abyzov
Viewed
0
Sam Chen 2020-12-26 00:02:17

太简单。

1.创建layer-list Drawable名为“ icon_check”的文件

<layer-list 
    xmlns:android="http://schemas.android.com/apk/res/android">

    <item                                           //for the round white background
        android:bottom="10dp"                       //margin, "<size>" tag doesn't work
        android:end="10dp"
        android:start="10dp"
        android:top="10dp">

        <shape 
            android:shape="oval">

            <solid 
                android:color="@color/white" />

        </shape>

    </item>

    <item
        android:drawable="@drawable/check"          //check mark from built-in asset
        android:bottom="14dp"                       //margin, extra 4dp is prefered
        android:end="14dp"
        android:start="14dp"
        android:top="14dp" />

</layer-list>

2.创建selector Drawable名为“ foreground_check”

<selector
    xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:drawable="@drawable/icon_check"             //layer-list created above
        android:state_selected="true" />

    <item
        android:drawable="@android:color/transparent"       //key point, 【"@null" doesn't work!!】
        android:state_selected="false" />

</selector>

3.设定 CardView

<androidx.cardview.widget.CardView                  //【MaterialCardView doesn't work!!】
    android:id="@+id/cardView"
    android:layout_width="40dp"
    android:layout_height="40dp"
    android:foreground="@drawable/foreground_check" //apply layer-list drawable
    app:cardBackgroundColor="@color/black"
    app:cardCornerRadius="20dp" />                  //half of side length

4.设置Ui控制器

cardView.setOnClickListener {
    it.isSelected = !it.isSelected
}

结果:

在此处输入图片说明