11

当我说

 button.setBackgroundColor(Color.BLUE);

按钮形状从默认形状变为矩形。我想在不影响其原始形状的情况下更改按钮颜色。请帮我。

4

9 回答 9

15

这是一个对我有用的解决方案,与公认的解决方案相反,它允许您动态更改颜色:

myButton = (ImageButton)myView.findViewById(R.id.my_button);
Drawable roundDrawable = getResources().getDrawable(R.drawable.round_button);
roundDrawable.setColorFilter(Color.BLUE, Mode.SRC_ATOP);

if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) {
    myButton.setBackgroundDrawable(roundDrawable);
} else {
    myButton.setBackground(roundDrawable);
}

我使用的“round_button”drawable的XML,例如:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <solid android:color="#4db6ac"/>
</shape>
于 2014-12-01T04:03:42.363 回答
9

每当您更改按钮的默认背景时,形状都会发生变化,因为默认形状是矩形,默认背景是可绘制圆角的形状。如果您使用任何其他背景,则此圆角效果将丢失。

如果使用可绘制的形状作为背景,则可以使用任何颜色或形状实现相同的效果。
以下是如何实现这一目标:

  1. 创建一个可绘制的形状。
  2. 将此可绘制对象用作按钮的背景。


形状可绘制的示例代码:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <solid
        android:color="#f8f8f8"/>
    <corners
        android:radius="4dp"/>
    <padding 
        android:left="10dp"
        android:right="10dp"
        android:top="5dp"
        android:bottom="5dp"/>
    <stroke 
        android:width="1dp"
        android:color="#aeaeae"/>
</shape>


如果你想要一个带有选择器的按钮,那么使用这个 xml 作为背景

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_pressed="true">
        <shape >
            <solid
                android:color="#ff0000" />
            <stroke 
                android:width="1dp"
                android:color="#ff0000" />
            <corners
                android:radius="4dp" />
            <padding
                android:left="10dp"
                android:right="10dp"
                android:top="10dp"
                android:bottom="10dp" />
        </shape>
    </item>
    <item >
        <shape >
            <gradient
                android:startColor="#ff2727"
                android:endColor="#890000"
                android:angle="270" />
            <stroke
                android:width="1dp"
                android:color="#620000" />
            <corners
                android:radius="4dp" />
            <padding
                android:left="10dp"
                android:right="10dp"
                android:top="10dp"
                android:bottom="10dp" />
        </shape>        
    </item>
</selector>

这是一个选择器 xml,其中项目作为不同的形状可绘制对象。如果按下按钮,即按钮的状态为state_pressed,则使用顶部可绘制形状,否则使用底部可绘制形状。
我希望这将有所帮助。

于 2012-07-27T06:22:03.563 回答
2

就在几分钟前,我遇到了同样的问题。在布局文件的 XML 中使用android:backgroundTint属性将解决该问题。按钮将保留其原始形状,并且波纹效果不会丢失。

XML 应该类似于:

 <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click Me!"
        android:textColor="#FFF"
        android:backgroundTint="#2196f3" />
于 2016-11-23T20:44:41.080 回答
0

当您默认使用颜色对象时,android系统使用paint对象填充按钮,并且paint对象只能填充矩形,圆形而不是曲线如果您真的想用颜色和曲线形状表示按钮,请使用自定义视图(帆布)

于 2012-07-27T05:38:28.460 回答
0

您可以创建自己的自定义按钮。

检查以下链接以获取帮助:

http://www.dibbus.com/2011/02/gradient-buttons-for-android/

于 2012-07-27T05:49:31.643 回答
0

在你的 layout.xml 中检查这个

机器人:背景=“*****”

于 2014-12-01T04:24:09.437 回答
0

这对我有用 - 在运行时/动态更改。例如,单击按钮时,颜色会发生变化,但形状需要保持不变。

首先,您需要在 xml 中定义按钮:

       <Button
            android:id="@+id/myButton"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="@drawable/buttonshape"
            android:text="Change Colour but keep shape, please" />

你会在上面看到它调用buttonshape,所以在你的drawable文件夹中:

(它是一个矩形,灰色,带有深灰色边框1dp

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="#D3D3D3" />
    <corners android:radius="3dp" />

    <stroke
        android:width="1dp"
        android:color="#aeaeae" />
</shape>

现在文件夹中的一个新xml文件, ,用于按钮按下状态。颜色将是绿色,其他一切都相同。drawablebuttonpressed.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    android:shape="rectangle">
    <solid android:color="#2AB40E" />
    <corners android:radius="3dp" />

    <stroke
        android:width="1dp"
        android:color="#aeaeae" />
</shape>

现在,在我们的活动中单击按钮:

 private void myButton() {

        myButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

//              keep the slightly rounded shape, when the button is pressed
                myButton.setBackgroundResource(R.drawable.buttonpressed);

etc..etc...
于 2018-02-01T13:45:30.630 回答
0

这是一个老问题,但对于未来的寻求者来说,这对我有用......

在可绘制的按钮形状中:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners
        android:bottomRightRadius="10dp"
        android:bottomLeftRadius="10dp"
        android:topRightRadius="10dp"
        android:topLeftRadius="10dp" />
</shape>

在按钮的 layout.xml 中:

<Button
    android:id="@+id/button"
    android:layout_width="150dp"
    android:layout_height="38dp"
    android:layout_marginEnd="20dp"
    android:layout_marginBottom="20dp"
    android:background="@drawable/buttonshape"
    android:backgroundTint="@color/colorButtonOrange"
    android:text="@string/button_text"
    android:textColor="@color/colorWhite"/>

使用android:backgroundTint,按钮在活动开始时变为橙色。

在我的活动中,我只用一行更改按钮颜色:

button.getBackground().setColorFilter(Color.GREY, PorterDuff.Mode.SRC_ATOP);
于 2020-04-01T15:14:15.933 回答
0

当使用“setBackgroundColor”改变视图的形状时,我遇到了同样的问题。我用“setTint”解决了它

于 2020-07-27T09:06:26.167 回答