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
:
- Android hacer la forma de diseño personalizado
- Android: sólo se muestra el último elemento en la lista de capas
- Cambiar el radio de la esquina de programación programable
- Necesito cambiar el color del trazo a un color definido por el usuario. Nada que ver con el estado
- RecyclerView con elementos personalizados
<?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?
- Escala de círculo según el tamaño de la pantalla
- ¿Cómo crear un teclado en pantalla de Android que no es un rectángulo en la parte inferior de la pantalla?
- ¿Cómo puedo dibujar la forma de la cinta Android Studio?
- ¿Cómo dibujo una flecha (en Android)?
- Fondo del botón de Android como forma con sombra
- SVG a Android forma
- Android - Rectángulo redondeado dentro de rectángulo redondeado
- ¿Cómo enviar datos multipart / form a un servidor web desde android?
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"); } }
- Android Java; ¿Cómo puedo analizar un archivo JSON local de carpeta de activos en un ListView
- Android Studio: El módulo no aparecerá en "Editar configuración"