我想稍微改变一个标准的Android按钮的颜色,以便更好地匹配客户端的品牌。

到目前为止,我发现最好的方法是将按钮的可绘制对象更改为位于res/drawable/red_button.xml中的可绘制对象:

<?xml version="1.0" encoding="utf-8"?>    
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/red_button_pressed" />
    <item android:state_focused="true" android:drawable="@drawable/red_button_focus" />
    <item android:drawable="@drawable/red_button_rest" />
</selector>

但是这样做需要为我想要自定义的每个按钮创建三个不同的绘图(一个用于静止的按钮,一个用于聚焦时的按钮,一个用于按下时的按钮)。这似乎比我需要的更复杂和非dry。

我真正想做的是对按钮应用某种颜色变换。有没有比我现在做的更简单的方法来改变按钮的颜色?


当前回答

在<Button>中使用android:background="#33b5e5"。或者更好的android:background="@color/navig_button"

其他回答

一个简单的方法是定义一个自定义的Button类,它接受你想要的所有属性,如半径,梯度,按下的颜色,正常颜色等,然后在你的XML布局中使用这些,而不是使用XML设置背景。这里有一个样本

如果你有很多具有相同属性的按钮,如半径,选定的颜色等,这是非常有用的。您可以自定义继承的按钮来处理这些附加属性。

结果(没有使用背景选择器)。

正常的按钮

按下按钮

现在有一个更简单的方法:androidholo -colors.com

它会让你改变所有holo drawables的颜色(按钮,旋转器,…)很容易。你选择颜色,然后下载一个压缩文件,其中包含所有分辨率的绘图。

DroidUX组件库有一个ColorButton小部件,它的颜色可以很容易地通过xml定义和运行时以编程方式改变,所以你甚至可以让用户设置按钮的颜色/主题,如果你的应用程序允许的话。

我发现这一切都可以在一个文件中相当容易地完成。在名为custom_button.xml的文件中放入如下代码,然后在按钮视图中设置background="@drawable/custom_button":

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

    <item android:state_pressed="true" >
        <shape>
            <gradient
                android:startColor="@color/yellow1"
                android:endColor="@color/yellow2"
                android:angle="270" />
            <stroke
                android:width="3dp"
                android:color="@color/grey05" />
            <corners
                android:radius="3dp" />
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />
        </shape>
    </item>

    <item android:state_focused="true" >
        <shape>
            <gradient
                android:endColor="@color/orange4"
                android:startColor="@color/orange5"
                android:angle="270" />
            <stroke
                android:width="3dp"
                android:color="@color/grey05" />
            <corners
                android:radius="3dp" />
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />
        </shape>
    </item>

    <item>        
        <shape>
            <gradient
                android:endColor="@color/blue2"
                android:startColor="@color/blue25"
                android:angle="270" />
            <stroke
                android:width="3dp"
                android:color="@color/grey05" />
            <corners
                android:radius="3dp" />
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />
        </shape>
    </item>
</selector>

我正在使用这种方法

style.xml

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:colorPrimaryDark">#413152</item>
    <item name="android:colorPrimary">#534364</item>
    <item name="android:colorAccent">#534364</item>
    <item name="android:buttonStyle">@style/MyButtonStyle</item>
</style>

<style name="MyButtonStyle" parent="Widget.AppCompat.Button.Colored">
    <item name="android:colorButtonNormal">#534364</item>
    <item name="android:textColor">#ffffff</item>
</style>

正如你从上面看到的,我正在为我的按钮使用自定义样式。按钮颜色与强调色相对应。我发现这是一个比设置android:background更好的方法,因为我不会失去谷歌提供的涟漪效应。