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