更改按钮颜色而不更改android中的形状

时间:2012-07-27 05:21:06

标签: android android-layout

当我说

 button.setBackgroundColor(Color.BLUE);

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

9 个答案:

答案 0 :(得分:7)

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

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

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

  3. 形状可绘制的示例代码:

    <?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,项目作为不同的形状drawables。如果按下按钮,即按钮的状态为 state_pressed ,则使用顶部形状drawable,否则使用底部形状drawable。 我希望这会有所帮助。

答案 1 :(得分:7)

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

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);
}

&#34; round_button&#34;的XML我使用过drawable,例如:

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

答案 2 :(得分:1)

几分钟前我遇到了同样的问题。 在布局文件的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" />

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

请查看以下链接以获取帮助:

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

答案 5 :(得分:0)

在layout.xml中查看此内容

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

答案 6 :(得分: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文件夹drawable中的新buttonpressed.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...

答案 7 :(得分: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);

答案 8 :(得分:0)

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