我正在尝试制作一个custom_button,到目前为止,有两个状态(按下和启用)与边界有各自的形状:
<?xml version='1.0' encoding='utf-8'?>
<selector xmlns:android='http://schemas.android.com/apk/res/android'>
<!-- Pressed -->
<item android:state_pressed='true'>
<layer-list>
<item> <!-- Border -->
<shape
android:shape='rectangle'>
<solid android:color='@color/Foreground'/>
</shape>
</item>
<item android:bottom='2dp' android:top='2dp' android:left='2dp' android:right='2dp'> <!-- Color -->
<shape
android:shape='rectangle'>
<solid android:color='@color/WidgetSoft'/>
</shape>
</item>
</layer-list>
</item>
<!-- Enabled -->
<item>
<layer-list>
<item> <!-- Border -->
<shape
android:shape='rectangle'>
<solid android:color='@color/Foreground'/>
</shape>
</item> <!-- Color -->
<item android:bottom='2dp' android:top='2dp' android:left='2dp' android:right='2dp'> <!-- Base Color -->
<shape
android:shape='rectangle'>
<solid android:color='@color/Widget'/>
</shape>
</item>
</layer-list>
</item>
</selector>
这是可行的,但它指定了两个相同的按钮,其中只有不同的颜色。当我添加其他按钮状态和更多的外观时,感觉这将越来越重复。是否有一种方法可以让base_button.xml绘图,在这里可以设置每个按钮的基本相同属性,以及可以在相应的标记中设置特定于按钮状态的属性的custom_button.xml?
下面是我的意思的一个伪例子,但我不知道如何使它成为现实。custom_button.xml处理按钮状态,base_button.xml指定按钮的基本特征。
custom_button.xml:
<?xml version='1.0' encoding='utf-8'?>
<selector xmlns:android='http://schemas.android.com/apk/res/android'>
<!-- Pressed -->
<item android:state_pressed='true' android:drawable='@drawable/base_button'>
<!-- SET GLOBAL_BORDER_COLOR TO '@color/btnPressedBorder' -->
<!-- SET GLOBAL_BASE_COLOR TO '@color/btnPressedBase' -->
</item>
<!-- Enabled -->
<item android:drawable='@drawable/base_button'>
<!-- SET GLOBAL_BORDER_COLOR TO '@color/btnEnabledBorder' -->
<!-- SET GLOBAL_BASE_COLOR TO '@color/btnEnabledBase' -->
</item>
</selector>
base_button.xml:
<?xml version='1.0' encoding='utf-8'?>
<layer-list xmlns:android='http://schemas.android.com/apk/res/android'>
<item>
<shape
android:shape='rectangle'>
<solid android:color= GLOBAL_BORDER_COLOR />
</shape>
</item>
<item android:bottom='2dp' android:top='2dp' android:left='2dp' android:right='2dp'>
<shape
android:shape='rectangle'>
<solid android:color= GLOBAL_BASE_COLOR />
</shape>
</item>
</layer-list>
这在XML中甚至是可能的吗?我在网上遇到了xsl:variable,但没能让它正常工作。任何关于如何获得相同结果的建议或其他方法都是非常感谢的!
发布于 2021-06-29 04:13:21
您可以使用ColorStateList作为颜色。为小部件的边框定义一个ColorStateList,为其填充定义一个。小部件的状态将向下推到将选择颜色的ColorStateList中。然后,您可以按以下方式定义可绘制的对象:
base_button.xml
<layer-list>
<item>
<shape android:shape='rectangle'>
<solid android:color="@color/widget_border" />
</shape>
</item>
<item
android:bottom='2dp'
android:left='2dp'
android:right='2dp'
android:top='2dp'>
<shape android:shape='rectangle'>
<solid android:color="@color/widget_fill" />
</shape>
</item>
</layer-list>
ColorStateLists看起来会是这样的。(请原谅选择的颜色。)
widget_fill.xml
<selector>
<item android:color="@android:color/holo_red_light" android:state_pressed="true" />
<item android:color="@android:color/holo_blue_light" android:state_enabled="true" />
</selector>
widget_border.xml
<selector>
<item android:color="@android:color/black" android:state_pressed="true" />
<item android:color="@android:color/holo_red_light" android:state_enabled="true" />
</selector>
最后,示例布局文件:
activity_main.xml
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:background="@drawable/base_button"
android:text="Button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
如果把这一切加在一起,看起来会是这样的:
https://stackoverflow.com/questions/68166352
复制