Nota : La respuesta se ha actualizado para cubrir el escenario donde background
hay una instancia de ColorDrawable
. Gracias Tyler Pfaff , por señalar esto.
El dibujo es un óvalo y es el fondo de un ImageView
Obtener el Drawable
de imageView
usar getBackground()
:
Drawable background = imageView.getBackground();
Verificar con 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()
los elementos dibujables antes de modificarlos si se usan en otro lugar. (De forma predeterminada, los elementos extraíbles cargados desde XML comparten el mismo estado).