56 votes

Android : Modifier la couleur de la forme en cours d'exécution

Je dispose d'un tableau que j'utilise comme arrière-plan pour un LinearLayout. Je voudrais changer la couleur de cette forme en cours d'exécution. J'ai essayé d'utiliser plusieurs méthodes mais aucune ne fonctionne.

J'ai suivi l'approche décrite ici : http://www.anddev.org/Android-2d-3d-graphics-opengl-problems-f55/change-shape-drawable-solid-color-t16798.html

Mais j'ai le même problème... il ne se plante pas... mais la couleur ne change pas !

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#00A6C1" />
    <corners android:radius="@dimen/square_corners" />
</shape>

Un extrait de code :

GradientDrawable drawable = (GradientDrawable) activity.getResources().getDrawable(R.drawable.blue_square_shape);

int color = ((Application) getApplication()).getColor();
drawable.setColor(color);

block.findViewById(R.id.blockSquare).setBackgroundDrawable(drawable);

findViewById(R.id.blockSquare).postInvalidate();

Un indice ? J'ai passé toute la journée à chercher sur Google... et ça devient assez ennuyeux...

UPDATE :

Quand j'essaie de faire la même chose avec ce Shape :

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/shape" android:shape="rectangle">
    <gradient android:startColor="#1FBCCF" android:endColor="#06A4C1"
        android:angle="270" />
    <corners android:topLeftRadius="@dimen/footer_corners"
        android:topRightRadius="@dimen/footer_corners" />
</shape>

La couleur vire au noir... ce qui me fait dire qu'elle peut être changée...

0 votes

Juste une supposition. Le Drawable n'est pas mutable, donc vous devez créer une copie, et muter celle-ci.

0 votes

Pourquoi le deuxième exemple devient-il noir ?! :-S

0 votes

Quelle est la couleur que vous avez choisie ? Le noir ?

42voto

NeTeInStEiN Points 7331

Je suis maintenant en train de créer un Drawable comme celui d'avant le compilateur car je n'ai pas pu changer la couleur en autre chose que noir, même après avoir essayé le OU hexagonal décrit ci-dessous.

Le nouveau code :

ShapeDrawable footerBackground = new ShapeDrawable();

// The corners are ordered top-left, top-right, bottom-right,
// bottom-left. For each corner, the array contains 2 values, [X_radius,
// Y_radius]
float[] radii = new float[8];
radii[0] = activity.getResources().getDimension(R.dimen.footer_corners);
radii[1] = activity.getResources().getDimension(R.dimen.footer_corners);

radii[2] = activity.getResources().getDimension(R.dimen.footer_corners);
radii[3] = activity.getResources().getDimension(R.dimen.footer_corners);

footerBackground.setShape(new RoundRectShape(radii, null, null));

int color = ((Application) activity.getApplication()).getColor();

footerBackground.getPaint().setColor(color);

views.setBackgroundDrawable(footerBackground);

Quoi qu'il en soit, c'est un correctif une solution pour la première question est ce que je recherche vraiment ! J'apprécierai toute aide bien sûr !

0 votes

Je trouve que l'utilisation de la technique Shape Drawable pour générer des coins arrondis est une meilleure solution que l'utilisation de la méthode des coins arrondis Gradient Drawable. Il semble y avoir un bogue avec Gradient Drawable : certains coins ne sont pas arrondis (ce qui fait que le bouton apparaît coupé) lorsque l'application est lancée et que l'écran tremble une fois. La méthode des coins arrondis de Shape Drawable fonctionne à 100% pour moi.

35voto

Saurabh Nanda Points 714

Voyez si quelque chose de similaire à ceci fonctionne pour vous :

TextView tv2 = (TextView) rl.findViewById(R.id.toggle_indicator);
/* Refer to http://developer.android.com/reference/android/graphics/drawable/GradientDrawable.html#mutate()
to understand why we need to mutate the GradientDrawable*/
GradientDrawable sd = (GradientDrawable) tv2.getBackground().mutate();
sd.setColor(0xff999999);
sd.invalidateSelf();

Dans mon cas, j'ai un TextView qui a un ShapeDrawable comme arrière-plan. Je voulais changer sa couleur et j'ai réussi à le faire fonctionner. Inexplicablement, tv2.getBackground() renvoie un GradientDrawable au lieu d'un ShapeDrawable -- cela a été signalé ailleurs également.

Edit : À propos de la couleur, essayez de définir une valeur alpha de 0xff. Si vous remarquez, même dans mon code ci-dessus, la fonction setColor() prend une valeur hexadécimale supplémentaire en plus de la valeur hexadécimale RVB normale. Il s'agit de la valeur Alpha/Opacité. Si cette valeur est fixée à 0x00, le Drawable aura une couleur noire, indépendamment du RGB (en supposant que votre couleur de fond soit noire). 0x00 est un objet complètement transparent et 0xff est un objet complètement opaque.

0 votes

@NeTeInStEiN regardez l'explication de la couleur noire que je viens d'ajouter. Si cela résout complètement votre problème, je vous demande de choisir cette réponse comme étant la bonne.

0 votes

+1 @SaurabhNanda pour avoir résolu mon problème. Très étrange, c'est un GradientDrawable, n'est-ce pas ?

0 votes

@SaurabhNanda Pourriez-vous m'aider avec quelque chose de similaire à ma question : stackoverflow.com/questions/35398658/

30voto

James Points 51
GradientDrawable background = (GradientDrawable) titleTextView.getBackground();
background.setColor(getResources().getColor(R.color.some_color));

La méthode setColor demande correctement un redessin sur l'élément (Si en xml vous avez utilisé l'élément <shape> il deviendra toujours un GradientDrawable)

1 votes

Assurez-vous que vous ne réutilisez pas ce dessinable ailleurs avant de changer sa couleur pour la bonne. Sur API<21 le drawable garde sa dernière couleur.

0 votes

Merci mon frère je me suis demandé pendant presque 2 heures pour cette chose stupide

9voto

R.drawable.library_cirecle

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/outerRectangle">
    <shape android:shape="oval" >
        <solid android:color="#FCD366" />

        <stroke
            android:width="1dp"
            android:color="@android:color/darker_gray" />
    </shape>
</item>

Changement de couleur dans le code

Drawable tempDrawable = getResources().getDrawable(R.drawable.library_cirecle);
LayerDrawable bubble = (LayerDrawable) tempDrawable; (cast to root element in xml)
GradientDrawable solidColor = (GradientDrawable) bubble.findDrawableByLayerId(R.id.outerRectangle);
solidColor.setColor(colorToPaint);
imageView.setImageDrawable(tempDrawable);

5voto

kospol Points 108

Il existe un moyen plus simple :

ShapeDrawable drawable = new ShapeDrawable();
drawable.getPaint().setColor(getResources().getColor(R.color.blue));
getActionBar().setBackgroundDrawable(drawable);

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