协慌网

登录 贡献 社区

具有不同颜色的标准 Android 按钮

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

到目前为止,我发现最好的方法是将Button的 drawable 更改为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>

但这需要我实际上为要自定义的每个按钮创建三个不同的可绘制对象(一个用于静止的按钮,一个用于聚焦,一个在按下时)。这似乎比我需要的更加复杂且非干燥。

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

答案

我发现这可以很容易地在一个文件中完成。将类似以下代码的内容放入名为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>

根据 Tomasz 的回答,您还可以使用 PorterDuff 乘法模式以编程方式设置整个按钮的阴影。这将改变按钮的颜色,而不只是色调。

如果从标准的灰色阴影按钮开始:

button.getBackground().setColorFilter(0xFFFF0000, PorterDuff.Mode.MULTIPLY);

会给您一个红色阴影的按钮,

button.getBackground().setColorFilter(0xFF00FF00, PorterDuff.Mode.MULTIPLY);

将为您提供绿色阴影按钮等,其中第一个值为十六进制格式的颜色。

通过将当前按钮的颜色值乘以您的颜色值来工作。我相信您可以使用这些模式做更多的事情。

迈克,您可能对彩色滤光片感兴趣。

一个例子:

button.getBackground().setColorFilter(new LightingColorFilter(0xFFFFFFFF, 0xFFAA0000));

尝试此操作以获得所需的颜色。