Establecer el color de la forma de Android mediante programación

Estoy editando para hacer la pregunta más simple, con la esperanza de que ayuda a una respuesta precisa.

Decir que tengo la siguiente forma oval :

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <solid android:angle="270" android:color="#FFFF0000"/> <stroke android:width="3dp" android:color="#FFAA0055"/> </shape> 

¿Cómo puedo configurar el color de forma programática, dentro de una clase de actividad?

Nota : La respuesta se ha actualizado para cubrir el escenario donde el background es una instancia de ColorDrawable . Gracias Tyler Pfaff , por señalar esto.

El dibujable es un óvalo y es el fondo de un ImageView

Obtenga el Drawable de imageView con getBackground() :

 Drawable background = imageView.getBackground(); 

Comprobar contra los sospechosos usuales:

 if (background instanceof ShapeDrawable) { // cast to 'ShapeDrawable' ShapeDrawable shapeDrawable = (ShapeDrawable) background; shapeDrawable.getPaint().setColor(ContextCompat.getColor(mContext,R.color.colorToSet)); } else if (background instanceof GradientDrawable) { // cast to 'GradientDrawable' GradientDrawable gradientDrawable = (GradientDrawable) background; gradientDrawable.setColor(ContextCompat.getColor(mContext,R.color.colorToSet)); } else if (background instanceof ColorDrawable) { // alpha value may need to be set again after this call ColorDrawable colorDrawable = (ColorDrawable) background; colorDrawable.setColor(ContextCompat.getColor(mContext,R.color.colorToSet)); } 

Versión compacta:

 Drawable background = imageView.getBackground(); if (background instanceof ShapeDrawable) { ((ShapeDrawable)background).getPaint().setColor(ContextCompat.getColor(mContext,R.color.colorToSet)); } else if (background instanceof GradientDrawable) { ((GradientDrawable)background).setColor(ContextCompat.getColor(mContext,R.color.colorToSet)); } else if (background instanceof ColorDrawable) { ((ColorDrawable)background).setColor(ContextCompat.getColor(mContext,R.color.colorToSet)); } 

Tenga en cuenta que la comprobación nula no es necesaria.

Sin embargo, debes usar mutate() en los drawables antes de modificarlos si se utilizan en otra parte. (Por defecto, drawables cargados desde XML comparten el mismo estado.)

Hazlo así:

  ImageView imgIcon = findViewById(R.id.imgIcon); GradientDrawable backgroundGradient = (GradientDrawable)imgIcon.getBackground(); backgroundGradient.setColor(getResources().getColor(R.color.yellow)); 

Prueba esto:

  public void setGradientColors(int bottomColor, int topColor) { GradientDrawable gradient = new GradientDrawable(Orientation.BOTTOM_TOP, new int[] {bottomColor, topColor}); gradient.setShape(GradientDrawable.RECTANGLE); gradient.setCornerRadius(10.f); this.setBackgroundDrawable(gradient); } 

Para más detalles ver este enlace esta

Espero ayuda

Espero que esto ayude a alguien con el mismo problema

 GradientDrawable gd = (GradientDrawable) YourImageView.getBackground(); //To shange the solid color gd.setColor(yourColor) //To change the stroke color int width_px = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, youStrokeWidth, getResources().getDisplayMetrics()); gd.setStroke(width_px, yourColor); 

Esta es la solución que funciona para mí … lo escribió en otra pregunta también: ¿Cómo cambiar el color de forma dinámica?

 //get the image button by id ImageButton myImg = (ImageButton) findViewById(R.id.some_id); //get drawable from image button GradientDrawable drawable = (GradientDrawable) myImg.getDrawable(); //set color as integer //can use Color.parseColor(color) if color is a string drawable.setColor(color) 

Ampliando la respuesta de Vikram , si está coloreando vistas dinámicas, como elementos de vista de reciclador, etc … Entonces probablemente desee llamar a mutate () antes de configurar el color. Si no lo hace, cualquier vista que tenga un dibujo común (es decir, un fondo) también tendrá su dibujable cambiado / coloreado.

 public static void setBackgroundColorAndRetainShape(final int color, final Drawable background) { if (background instanceof ShapeDrawable) { ((ShapeDrawable) background.mutate()).getPaint().setColor(color); } else if (background instanceof GradientDrawable) { ((GradientDrawable) background.mutate()).setColor(color); } else if (background instanceof ColorDrawable) { ((ColorDrawable) background.mutate()).setColor(color); }else{ Log.w(TAG,"Not a valid background type"); } } 
  • Dibujar la forma de Android xml diagonal con triángulos
  • Android: ¿Cómo puedo utilizar la capa de lista y los elementos de forma para dibujar una regla horizontal cuando se establece como fondo?
  • Especificación de recortes transparentes en xml
  • Forma dibujable como fondo, una línea en la parte inferior
  • ¿Cómo agrego el relleno a un mapa de bits y un color en una lista de capas
  • Android 4 ICS Ice Cream Sandwich - iframe que contiene un formulario
  • Android Shape - Gradiente debe ir al lado derecho
  • Android: Disposición con la sombra de la gota redondeada
  • Forma personalizada mientras conversas en android usando un archivo xml
  • Forma de androide dentro de una forma
  • Frontera con título alrededor de un LinearLayout
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.