Cambiar el color del botón sin cambiar la forma en Android

Cuando yo digo

 button.setBackgroundColor(Color.BLUE);

la forma del botón cambia a rectángulo desde la forma predeterminada. Quiero cambiar el color del botón sin afectar su forma original. Por favor, ayúdame.

preguntado el 27 de julio de 12 a las 06:07

¿Ha tomado el botón predeterminado? -

Su botón tiene en realidad forma de rectángulo, el dibujo en esquina solo hace que parezca que no es un rectángulo en absoluto. -

¿Está configurando alguna imagen como fondo del botón? -

Pero afecta a todo el diseño. Creé un evento para un botón. Si se presiona el botón, se debe cambiar el color. Ocurrió. Pero el formato de diseño, la alineación de otros botones cambió. -

9 Respuestas

Aquí hay una solución que funcionó para mí, que, contrariamente a la solución aceptada, le permitirá cambiar el color dinámicamente:

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

XML del dibujable "round_button" que utilicé, como ejemplo:

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

Respondido el 01 de diciembre de 14 a las 04:12

Gracias por esto @Yoann Hercouet. Esto debe marcarse como respuesta aceptada ya que esto es realmente lo que se preguntó en la pregunta. - gagan

puede configurar directamente el filtro de color en el fondo sin tener que volver a obtener el dibujable de los recursos como este view.getBackground().setColorFilter( , Modo.SRC_ATOP); sin embargo, esta respuesta es más correcta que la aceptada: SDIDSA

Siempre que cambie el fondo predeterminado de su botón, la forma cambiará, ya que la forma predeterminada es un rectángulo y el fondo predeterminado es una forma dibujable con esquinas redondeadas. Si usa cualquier otro fondo, este efecto de esquina redondeada se pierde.

Puede lograr el mismo efecto con cualquier color o forma si usa una forma dibujable como fondo.
Así es como puede lograr esto:

  1. Crea una forma dibujable.
  2. Usa este dibujo como fondo del botón.


código de muestra para forma dibujable:

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


Si desea tener un botón con un selector, use este xml como fondo

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

Este es un selector xml con elementos como los dibujables de diferentes formas. Si se presiona el botón, el estado del botón es estado_presionado luego se usa la forma dibujable superior, de lo contrario se usa la forma dibujable inferior.
Espero que esto sea de ayuda.

Respondido 27 Jul 12, 07:07

No está funcionando para mi. si establezco el color de fondo en tiempo de ejecución, la forma cambia a rectángulo. - Lakshmanán

@Lakshmanan el código anterior si para usar la forma dibujable a través de xml. Si después de configurar el fondo en el xml cambia el fondo a través del código, se anulará el efecto anterior (fondo). - Karn

Estaba enfrentando el mismo problema hace solo unos minutos. Utilizando android:backgroundTint La propiedad en XML de su archivo de diseño en su lugar resolverá el problema. El botón conservará su forma original y el efecto dominó no se perderá.

El XML debería ser algo como:

 <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click Me!"
        android:textColor="#FFF"
        android:backgroundTint="#2196f3" />

respondido 23 nov., 16:20

Cuando usa el objeto de color de forma predeterminada, el sistema Android usa el objeto de pintura para llenar el botón y el objeto de pintura puede llenar solo el rectángulo, las formas circulares en lugar de las curvas. Si realmente desea representar un botón con color y forma de curva, use la vista personalizada ( lienzo)

Respondido 27 Jul 12, 06:07

Puede crear sus propios botones personalizados.

Consulte el siguiente enlace para obtener ayuda:

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

Respondido 27 Jul 12, 06:07

Verifique con esto en su diseño.xml

Android:fondo="*****"

Respondido el 01 de diciembre de 14 a las 04:12

Esto funcionó para mí: cambiar en tiempo de ejecución/dinámicamente. Por ejemplo, cuando se hace clic en el botón, el color cambia, pero su forma debe permanecer igual.

Primero, necesitas definir en xml el botón:

       <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" />

Verás arriba llama buttonshape, así que en tu drawable carpeta:

(Es un rectángulo, gris, con un borde gris oscuro de 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>

Ahora un nuevo xml archivo en drawable carpeta, buttonpressed.xml, para el estado de botón presionado. El color será verde, todo lo demás igual.

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

Ahora, en el botón haga clic en nuestra actividad:

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

Respondido 01 Feb 18, 13:02

Es una vieja pregunta, pero para los futuros buscadores, esto funcionó para mí...

En dibujable la forma del botón:

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

En mi layout.xml para el botón:

<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"/>

Con la android:backgroundTint, los botones adquieren un color naranja cuando se inicia la actividad.

En mi Actividad, cambio el color del botón con una sola línea:

button.getBackground().setColorFilter(Color.GREY, PorterDuff.Mode.SRC_ATOP);

Respondido 01 Abr '20, 16:04

Tuve el mismo problema cuando usé "setBackgroundColor" y estaba cambiando la forma de la Vista. Lo resolví con "setTint"

Respondido 27 Jul 20, 10:07

El método ni siquiera existe en mi botón; de lo contrario, me hubiera encantado esa solución. - Brian Reinhold

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.