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 ?

1voto

Kaj Points 6802

C'est ce que je fais dans un live wallpaper 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());

Edit : Déclarations de type :

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

Edit 2 :

Essayez ceci dans ce cas :

int color = (0xFF000000 | yourParsedColor)

Ensuite, définissez cette couleur.

0 votes

Quel est le type d'original et de copie ?

0 votes

Même avec ça ça devient seulement noir :-(

0 votes

Dans ce cas, il faudrait que je le débogue, mais ce n'est malheureusement pas quelque chose que j'aimerais faire :(.

-1voto

Heinous Games Points 184

Ma solution actuelle consiste à avoir un dessinable sans option de couleur. Je le place à l'intérieur d'un cadre de mise en page, puis je fixe dynamiquement la couleur d'arrière-plan de l'objet de mise en page du cadre. Techniquement, il s'agit toujours d'un "correctif", mais c'est l'option la plus simple à mon avis.

Fichier de mise en page :

<FrameLayout
    android:id="@+id/dateLayout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@color/SecondaryGreen">

    <ImageView
        android:id="@+id/dateBox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/date_rectangle" />

</FrameLayout>

Date Rectangle Drawable File :

<shape xmlns:android="http://schemas.android.com/apk/res/android" ><size android:width="50dp" android:height="50dp"/><corners android:radius="5dp"/></shape>

Rendu dynamique :

mHolder.dateLayout.setBackgroundColor(getResources().getColor(R.color.SecondaryGreen));

-1voto

Avinash Jadhav Points 341

Définir la couleur de la forme GradientDrawable à l'aide d'un code/valeur hexadécimal
Il suffit de préfixer 0x à la valeur hexadécimale de la couleur.

    GradientDrawable shape =  new GradientDrawable();
    shape.setCornerRadius( 16 );
    shape.setColor(0xff33b5e5);
    ButtonStartSurvey.setBackground(shape);

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