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

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

Digamos que tengo la siguiente forma oval :

      

¿Cómo configuro el color mediante progtwigción, desde 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 usando getBackground() :

 Drawable background = imageView.getBackground(); 

Verifique contra los sospechosos habituales:

 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 no se requiere verificación nula.

Sin embargo, debe usar mutate() en los objetos descartables antes de modificarlos si se usan en otro lugar. (De forma predeterminada, los objetos extraíbles 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, consulte este enlace

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

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

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

esta es la solución que funciona para mí … también la escribí en otra pregunta: ¿cómo cambiar el color de forma 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) 

Esta pregunta fue respondida hace un tiempo, pero se puede modernizar reescribiendo como una función de extensión de kotlin.

 fun Drawable.overrideColor(@ColorInt colorInt: Int) { when (this) { is GradientDrawable -> setColor(colorInt) is ShapeDrawable -> paint.color = colorInt is ColorDrawable -> color = colorInt } } 

Una solución más simple hoy en día sería usar su forma como fondo y luego cambiar su color mediante progtwigción

view.getBackground().setColorFilter(Color.parseColor("#343434"), PorterDuff.Mode.SRC_OVER)