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

15voto

medhdj Points 36

J'espère que cela aidera quelqu'un qui a le même problème.

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

12voto

Tyler Pfaff Points 247

Élargir le champ d'action Vikram réponse, si vous coloriez des vues dynamiques, comme des éléments de vue de recycleur, etc..... Alors vous voulez probablement appeler mutate() avant de définir la couleur. Si vous ne le faites pas, toutes les vues qui ont un dessinable commun (c'est-à-dire un arrière-plan) verront également leur dessinable modifié/coloré.

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

}

7voto

Voici la solution qui fonctionne pour moi... je l'ai également écrite dans une autre question : Comment changer la couleur de la forme de manière dynamique ?

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

7voto

Sumit Points 11

Rien ne fonctionne pour moi, mais lorsque je règle la couleur de la teinte, cela fonctionne sur le Shape Drawable.

 Drawable background = imageView.getBackground();
 background.setTint(getRandomColor())

nécessite Android 5.0 API 21

3voto

Sattar Hummatli Points 689

Mi Kotlin fonction d'extension version basée sur les réponses ci-dessus avec Compat :

fun Drawable.overrideColor_Ext(context: Context, colorInt: Int) {
    val muted = this.mutate()
    when (muted) {
        is GradientDrawable -> muted.setColor(ContextCompat.getColor(context, colorInt))
        is ShapeDrawable -> muted.paint.setColor(ContextCompat.getColor(context, colorInt))
        is ColorDrawable -> muted.setColor(ContextCompat.getColor(context, colorInt))
        else -> Log.d("Tag", "Not a valid background type")
    }
}

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