2012-05-04 25 views
12

我知道有类似的帖子,但我无法找到我的答案在他们中的任何一个。所以,我有这个可绘制XML:Android选择器与背景图像和渐变

<?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> 

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

+0

你是否将文件设置为Button的背景? – Akram

+0

是的:android:background =“@ drawable/button” – ali

回答

41

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

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

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

其实你应该只删除state_enabled,让Bitmap + gradient是为Button的默认值。波纹管是你的选择器(我假设你只想改变图像上的渐变(但即使在按下状态下图像也应该出现,如果这不是想要的行为,只留下state_pressed的梯度)):

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

    <item android:state_pressed="true"> 
     <layer-list> 
      <item> 
       <bitmap android:gravity="center" android:src="@drawable/bm_btn_background" android:tileMode="repeat" /> 
      </item> 
      <item> 
       <shape> 
        <gradient android:angle="270" android:endColor="#a0e0b071" android:startColor="#a0a67637" /> 
        <stroke android:width="1dp" android:color="#5c3708" /> 
        <corners android:radius="5dp" /> 
        <padding android:bottom="10dp" android:left="10dp" android:right="10dp" android:top="10dp" /> 
       </shape> 
      </item> 
     </layer-list> 
    </item> 

    <item android:state_enabled="true"> 
     <layer-list> 
      <item> 
       <bitmap android:gravity="center" android:src="@drawable/bm_btn_background" android:tileMode="repeat" /> 
      </item> 
      <item> 
       <shape android:shape="rectangle"> 
        <gradient android:angle="270" android:endColor="#a0a67637" android:startColor="#a0e0b071" /> 
        <stroke android:width="1dp" android:color="#5c3708" /> 
        <corners android:radius="5dp" /> 
        <padding android:bottom="10dp" android:left="10dp" android:right="10dp" android:top="10dp" /> 
       </shape> 
      </item> 
     </layer-list> 
    </item> 


</selector> 
+0

现在我明白国家如何解释。谢谢。这工作!感谢大家1 – ali

+0

很好的回答+1。 – Akram

+0

一个小问题。圆角不适用于背景,只适用于形状。 – ali

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> 

0

拿上你的状态看attrubute

<?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倍间距的图像。

+0

你的意思是'9-patch'。 –

0

我已经添加额外transperent空间到图像的右侧使用Photoshop的画布大小选项,它适用于我。下载下面的图片看演示。 enter image description here