这是我尝试构建的按钮选择器的布局:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_enabled="true" android:state_pressed="true" android:drawable="@drawable/btt_down" />
<item android:state_enabled="false" android:drawable="@drawable/btt_disabled" />
<item android:drawable="@drawable/btt_normal"/>
</selector>
这里是普通状态按钮(btt_normal.xml)的布局。
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"
>
<solid android:color="@color/btt_normal"/>
<corners
android:radius="@dimen/rounded_rect_corner_radius"
/>
<padding
android:left="@dimen/rounded_rect_padding"
android:top="@dimen/rounded_rect_padding"
android:right="@dimen/rounded_rect_padding"
android:bottom="@dimen/rounded_rect_padding"
/>
</shape>
这个布局与btt_down.xml和btt_disabled.xml布局之间的唯一区别是这一行:
<solid android:color="@color/..."/>
我想知道是否有定义中性(无色)圆角矩形可绘制资源的方法,并以某种方式(继承?)为它指定不同的颜色并在选择器中使用它们?
我理解我可以通过将所有舍入的rects定义为选择器的一部分来减少资源,但为了维护起见,我非常希望避免一次又一次地复制/粘贴相同的代码行色线区分它们。
谢谢。
答案 0 :(得分:0)
您可以定义像
这样的xml<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:color="#000000" /> <!-- pressed -->
<item android:state_focused="true"
android:color="#000000" /> <!-- focused -->
<item android:color="#FFFFFF" /> <!-- default -->
</selector>
答案 1 :(得分:0)
要回答我自己的问题,我找不到避免重新定义矩形的方法。 因此,我没有为每个状态(正常,按下,聚焦,禁用)和一个选择器文件提供文件,而是最终将所有状态放在单个选择器文件中,只有颜色区分状态。前景色也是一个选择器,颜色和矩形尺寸是从值资源文件中检索的。
以下是所有参与文件的目录大纲:
project
+-color
+ btt_fg_selector.xml
+-drawable
+ btt_bg_selector.xml
+-res
+-colors.xml
+-dimens.xml
以下是带有按和正常状态的选择器文件,并且为了完整答案 - 还有值资源文件:
<强> btt_bg_selector.xml 强>
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- pressed -->
<item android:state_pressed="true">
<shape>
<solid android:color="@color/btt_bg_pressed" />
<corners android:radius="@dimen/btt_rr_radius" />
<padding android:left="@dimen/btt_rr_padding" android:top="@dimen/btt_rr_padding" android:right="@dimen/btt_rr_padding" android:bottom="@dimen/btt_rr_padding" />
</shape>
</item>
<!-- normal/default -->
<item>
<shape>
<solid android:color="@color/btt_bg_normal" />
<corners android:radius="@dimen/btt_rr_radius" />
<padding android:left="@dimen/btt_rr_padding" android:top="@dimen/btt_rr_padding" android:right="@dimen/btt_rr_padding" android:bottom="@dimen/btt_rr_padding" />
</shape>
</item>
</selector>
<强> btt_fg_selector.xml 强>
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:color="@color/btt_fg_pressed" /> <!-- pressed -->
<item android:color="@color/btt_fg_normal" /> <!-- normal/default -->
</selector>
<强> colors.xml 强>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="btt_bg_normal">#0000ff</color>
<color name="btt_bg_pressed">#ffff00</color>
<color name="btt_fg_normal">#ffff00</color>
<color name="btt_fg_pressed">#ff0000</color>
</resources>
<强> dimens.xml 强>
<resources>
<!-- Round rect values -->
<dimen name="btt_rr_radius">15dp</dimen>
<dimen name="btt_rr_padding">10dp</dimen>
</resources>