Android选择器与背景图像和渐变

时间:2012-05-04 13:00:17

标签: android button background

我知道有相似的帖子,但我找不到任何一个答案。所以,我有这个可绘制的XML:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="true">
    <bitmap
        android:src="@drawable/bm_btn_background"
        android:tileMode="repeat"
        android:gravity="center" />
</item>
<item android:state_enabled="true">
    <shape android:shape="rectangle">
        <gradient
            android:startColor="#a0e0b071"
            android:endColor="#a0a67637"
            android:angle="270" />
        <stroke
            android:width="1dp"
            android:color="#5c3708" />
        <corners
            android:radius="5dp" />
        <padding
            android:left="10dp"
            android:top="10dp"
            android:right="10dp"
            android:bottom="10dp" />
    </shape>
</item>
<item android:state_pressed="true" >
    <shape>
        <gradient
            android:startColor="#a0a67637"
            android:endColor="#a0e0b071"
            android:angle="270" />
        <stroke
            android:width="1dp"
            android:color="#5c3708" />
        <corners
            android:radius="5dp" />
        <padding
            android:left="10dp"
            android:top="10dp"
            android:right="10dp"
            android:bottom="10dp" />
    </shape>
</item>

我正在尝试创建一个按钮,其中重复的图像作为背景并应用了渐变。使用此代码我只能看到背景图像,而不是渐变,边框和圆角。此外,当我单击按钮时,它不会更改(渐变应该更改)。我不知道这段代码有什么问题?如果我使用图层列表代替选择器,我会得到所需的结果,但是当我按下按钮时它也不会改变。谢谢你的帮助!

4 个答案:

答案 0 :(得分:48)

您的选择器代码错误,因为:

  • 您有两个相同状态的元素,并且选择器遇到state_enabled元素的第一个状态(Bitmap),它将停在那里,您的渐变将永远不会出现(为此你应该使用layer-list作为Bitmap和渐变顶部的项目

  • 选择器将按顺序匹配状态。当您按Button时,永远不会激活state_pressed,因为选择器将首先匹配第一个元素上的state_enabled(为此,您应移动{{1}的代码在state_enabled元素之上)。

事实上,您应该删除state_pressed并让state_enabled + Bitmap成为gradient的默认值。贝娄是你的选择器(我假设你只想改变图像上的渐变(但是图像应该出现在按下状态,如果这不是想要的行为,只留下Button的渐变)):

state_pressed

答案 1 :(得分:0)

在我的情况下,我正在使用它。试试吧

<item android:state_pressed="true">
    <shape>
        <solid android:color="@color/mediumGray" />

        <stroke
            android:width="1px"
            android:color="@color/darkGray" />

        <padding
            android:bottom="2dp"
            android:left="1dp"
            android:right="1dp"
            android:top="2dp" />

        <corners
            android:bottomLeftRadius="7sp"
            android:bottomRightRadius="7sp"
            android:topLeftRadius="7sp"
            android:topRightRadius="7sp" />
    </shape>
</item>
<item android:state_focused="true">
    <shape>
        <solid android:color="@color/mediumGray" />

        <stroke
            android:width="1px"
            android:color="@color/darkGray" />

        <padding
            android:bottom="2dp"
            android:left="1dp"
            android:right="1dp"
            android:top="2dp" />

        <corners
            android:bottomLeftRadius="7sp"
            android:bottomRightRadius="7sp"
            android:topLeftRadius="7sp"
            android:topRightRadius="7sp" />
    </shape>
</item>
<item>
    <shape>
        <solid android:color="@color/lightGray" />

        <stroke
            android:width="1px"
            android:color="@color/blackTransparent" />

        <padding
            android:bottom="2dp"
            android:left="1dp"
            android:right="1dp"
            android:top="2dp" />

        <corners
            android:bottomLeftRadius="7sp"
            android:bottomRightRadius="7sp"
            android:topLeftRadius="7sp"
            android:topRightRadius="7sp" />
    </shape>
</item>

答案 2 :(得分:0)

查看您的州属性

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- Non focused states -->
    <item android:drawable="@drawable/nicebuttonround" android:state_focused="false" android:state_pressed="false" android:state_selected="false"/>
    <item android:drawable="@drawable/nicebuttonround" android:state_focused="false" android:state_pressed="false" android:state_selected="true"/>

    <!-- Focused states -->
    <item android:drawable="@drawable/nicebuttonroundi" android:state_focused="true" android:state_pressed="false" android:state_selected="false"/>
    <item android:drawable="@drawable/nicebuttonroundi" android:state_focused="true" android:state_pressed="false" android:state_selected="true"/>

    <!-- Pressed -->
    <item android:drawable="@drawable/nicebuttonroundi" android:state_pressed="true" android:state_selected="true"/>
    <item android:drawable="@drawable/nice22i" android:state_pressed="true"/>

</selector>

要将背景重复为图像,您只需创建9个音高图像。

答案 3 :(得分:0)

我使用photoshop画布尺寸选项在图像的右侧添加了额外的transperent空间,它对我来说很好。下载图像以查看演示。 enter image description here