Android中圆角矩形按钮选择器的最小资源?

时间:2014-03-19 22:43:48

标签: android xml button user-interface

这是我尝试构建的按钮选择器的布局:

<?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定义为选择器的一部分来减少资源,但为了维护起见,我非常希望避免一次又一次地复制/粘贴相同的代码行色线区分它们。

谢谢。

2 个答案:

答案 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>
在res / color文件夹中,并将其用作可绘制布局中的颜色。

答案 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>