Nota : la risposta è stata aggiornata per coprire lo scenario in cui si background
trova un'istanza di ColorDrawable
. Grazie Tyler Pfaff , per averlo segnalato.
Il disegno è un ovale ed è lo sfondo di un ImageView
Ottieni Drawable
da imageView
usando getBackground()
:
Drawable background = imageView.getBackground();
Controlla contro i soliti sospetti:
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));
}
Versione compatta:
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));
}
Si noti che il controllo null non è richiesto.
Tuttavia, è necessario utilizzare mutate()
i disegni prima di modificarli se utilizzati altrove. (Per impostazione predefinita, i drawable caricati da XML condividono lo stesso stato.)