230 votes

Définir la couleur des formes Android de manière programmatique

J'essaie de simplifier la question, en espérant que cela aidera à trouver une réponse précise.

Disons que j'ai les éléments suivants oval forme :

<?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>

Comment puis-je définir la couleur de manière programmatique, à partir d'une classe d'activité ?

310voto

Vikram Points 17845

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

78voto

George Points 1505

Une solution plus simple aujourd'hui serait d'utiliser votre forme comme arrière-plan, puis de modifier sa couleur par programmation :

view.background.setColorFilter(Color.parseColor("#343434"), PorterDuff.Mode.SRC_ATOP)

Voir PorterDuff.Mode pour les options disponibles.

MISE À JOUR (API 29) :

La méthode ci-dessus est dépréciée depuis l'API 29 et remplacée par la suivante :

view.background.colorFilter = BlendModeColorFilter(Color.parseColor("#343434"), BlendMode.SRC_ATOP)

Voir BlendMode pour les options disponibles.

51voto

TerryLin Points 119

Faites comme ça :

    ImageView imgIcon = findViewById(R.id.imgIcon);
    GradientDrawable backgroundGradient = (GradientDrawable)imgIcon.getBackground();
    backgroundGradient.setColor(getResources().getColor(R.color.yellow));

26voto

Carlos Paulino Points 647

Cette question a reçu une réponse il y a quelque temps, mais elle peut être modernisée en la réécrivant comme une fonction d'extension kotlin.

fun Drawable.overrideColor(@ColorInt colorInt: Int) {
    when (this) {
        is GradientDrawable -> setColor(colorInt)
        is ShapeDrawable -> paint.color = colorInt
        is ColorDrawable -> color = colorInt
    }
}

16voto

androidqq6 Points 241

Essayez ça :

 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);
 }

Pour plus de détails, consultez ce lien este

L'espoir aide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X