studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android android-layout shape

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



manual de programacion android pdf (7)

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 :

<?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 configuro el color mediante programación, desde dentro de una clase de actividad?


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


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


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.


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)


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