Note : La réponse a été mise à jour pour couvrir le scénario où background
est une instance de ColorDrawable
. Merci Tyler Pfaff pour l'avoir signalé.
L'objet à dessiner est un ovale et constitue l'arrière-plan d'une ImageView.
Obtenez le Drawable
de imageView
en utilisant getBackground()
:
Drawable background = imageView.getBackground();
Vérifier les suspects habituels :
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));
}
Version compacte :
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));
}
Notez que la vérification des nullités n'est pas nécessaire.
Cependant, vous devez utiliser mutate()
sur les dessinateurs avant de les modifier s'ils sont utilisés ailleurs. (Par défaut, les drawables chargés à partir de XML partagent le même état).