web-dev-qa-db-fra.com

Android: Modifier la couleur de la forme lors de l'exécution

J'ai un dessin que j'utilise comme arrière-plan pour un LinearLayout. Je voudrais changer la couleur de cette forme lors de l'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 ayez le même problème ... ça ne 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>

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 à googler ... et ça devient assez ennuyeux ...

MISE À JOUR:

Quand j'essaye de faire la même chose avec cette forme:

<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 que je suppose qu'il peut être changé ...

50
neteinstein

Je suis en train de créer un Drawable comme celui du pré-compilateur .. car je ne pouvais pas changer la couleur en autre chose que le noir, même après avoir essayé l'hex OR 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 à la première question est ce que je recherche vraiment! J'apprécierai toute aide bien sûr!

41
neteinstein

Voyez si quelque chose de similaire vous convient:

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. J'ai voulu changer sa couleur et j'ai réussi à faire ce travail. Inexplicablement, tv2.getBackground () renvoie un GradientDrawable au lieu d'un ShapeDrawable - cela a également été signalé ailleurs.

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 dehors de la valeur hexadécimale RVB normale. C'est pour Alpha/Opacity. Si ce paramètre est défini sur 0x00, le Drawable aura une couleur noire, indépendamment du RVB (en supposant que votre couleur d'arrière-plan est noire). 0x00 est un objet complètement transparent et 0xff est un objet complètement opaque.

34
Saurabh Nanda
GradientDrawable background = (GradientDrawable) titleTextView.getBackground();
background.setColor(getResources().getColor(R.color.some_color));

La méthode setColor demande correctement un nouveau dessin sur l'élément (si en XML vous avez utilisé l'élément <shape>, il deviendra toujours un GradientDrawable)

29
James

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>

Changer la couleur du 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);
8

Il existe un moyen plus simple:

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

C'est ce que je fais dans un fond d'écran en direct où je modifie un Drawable au moment de l'exécution:

this.original = DrawableFactory.getDrawable(getContext().getResources(), objectName)[0];
originalBitmap = original.getBitmap();
copy = new BitmapDrawable(getContext().getResources(), original.getBitmap().copy(Bitmap.Config.ARGB_8888, true));
copyCanvas = new Canvas(copy.getBitmap());

Modifier: Déclarations de type:

public Bitmap originalBitmap;
public BitmapDrawable original;
public BitmapDrawable copy;
public Canvas copyCanvas;

Modifier 2:

Essayez ceci dans ce cas:

int color = (0xFF000000 | yourParsedColor)

Ensuite, définissez cette couleur.

1
Kaj