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é ...
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!
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.
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)
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);
Il existe un moyen plus simple:
ShapeDrawable drawable = new ShapeDrawable();
drawable.getPaint().setColor(getResources().getColor(R.color.blue));
getActionBar().setBackgroundDrawable(drawable);
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.