使用 android 可绘制形状的有效且结构化的方法是什么?

What is the efficient & structured way to use android drawable shape?

我需要在我的项目中使用不同设计的几个按钮。所以我使用可绘制形状来制作自定义按钮。

假设我需要一个带有圆角和绿色背景的按钮。所以我创建了一个形状 "gree_round_button.xml" 并且效果很好。但是话又说回来,我需要另一个具有相同样式的按钮,只是背景颜色会有所不同,为此我必须创建另一个 xml 文件,例如 "colorName_round_button.xml"?

为了便于理解,我尽量保持简单,但对于不同的按钮可能有许多通用样式,可能只有一两个 属性 不同。有什么方法可以跳过为同一设计创建多个文件吗?有什么方法可以用来扩展任何形状并且可以将颜色、背景颜色作为参数传递? 可能是这样的 "button.xml" 这个形状将接受一个颜色参数,我可以为我想使用的每个按钮使用这个形状,并将不同的颜色作为参数传递。

在网络中Css:我可以做这样的事情

.button {border: 1px solid #ddd;border-radius:5px;padding:20px;}
.button.green {background:green;}

有没有简单的方法可以做这样的事情。 谢谢

您应该看看 backgroundTint 这将允许您使用相同的可绘制对象但用不同的颜色覆盖它。

例如,您可以有一个 bg_circle.xml,它是一个白色圆圈。然后使用 tint 改变它的颜色,并将你的单独图标作为 src.

<ImageButton
    android:layout_width="75dp"
    android:layout_height="75dp"
    android:src="@drawable/ic_check_mark"
    android:background="@drawable/bg_circle"
    android:backgroundTint="@color/red"
    />

这样您只需要一个 round_button.xml 就可以用作所有按钮的背景,并根据需要用不同的颜色着色。然后每个图标的内容都可以是它自己的可绘制对象。

下面的四个按钮只用了 3 个 drawable:

<ImageButton
    android:layout_width="75dp"
    android:layout_height="75dp"
    android:src="@drawable/ic_feather"
    android:background="@android:drawable/btn_default"
    />

<ImageButton
    android:layout_width="75dp"
    android:layout_height="75dp"
    android:src="@drawable/ic_feather"
    android:background="@android:drawable/btn_default"
    android:backgroundTint="@color/colorPrimaryDark"
    />

<ImageButton
    android:layout_width="75dp"
    android:layout_height="75dp"
    android:src="@drawable/ic_plane"
    android:background="@android:drawable/btn_default"
    android:backgroundTint="@color/colorPrimaryDark"
    />
<ImageButton
    android:layout_width="75dp"
    android:layout_height="75dp"
    android:src="@drawable/ic_plane"
    android:background="@android:drawable/btn_default"
    android:backgroundTint="@color/colorAccent"
    />