web-dev-qa-db-fra.com

Modification des couleurs d'arrière-plan du dégradé sur Android au moment de l'exécution

J'expérimente avec des arrière-plans Drawable et je n'ai eu aucun problème jusqu'à présent.

J'essaie maintenant de changer la couleur de fond du dégradé à l'exécution.

Malheureusement, il semble qu'aucune API ne le modifie au moment de l'exécution. Pas même en essayant de muter () le drawable, comme expliqué ici: Mutations drawable

L'exemple XML ressemble à ceci. Cela fonctionne, comme prévu.

<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:shape="rectangle">
    <gradient
        Android:startColor="#330000FF"
        Android:endColor="#110000FF"
        Android:angle="90"/>
</shape>

Malheureusement, je veux une liste avec différentes couleurs, et elles devraient être modifiées par programme lors de l'exécution.

Existe-t-il un autre moyen de créer ce fond dégradé à l'exécution? Peut-être même ne pas utiliser XML complètement?

20
Phenome

Oui! J'ai trouvé un moyen!

J'ai dû oublier XML, mais voici comment je l'ai fait:

Sur ma fonction surchargée getView () (ListAdapter) il me suffisait de:

    int h = v.getHeight();
    ShapeDrawable mDrawable = new ShapeDrawable(new RectShape());
    mDrawable.getPaint().setShader(new LinearGradient(0, 0, 0, h, Color.parseColor("#330000FF"), Color.parseColor("#110000FF"), Shader.TileMode.REPEAT));
    v.setBackgroundDrawable(mDrawable);

Et cela m'a donné le même résultat que l'arrière-plan XML ci-dessus. Maintenant, je peux définir par programme la couleur d'arrière-plan.

37
Phenome

J'ai essayé d'utiliser la solution de Phenome pour la vue Bouton. Mais de toute façon cela n'a pas fonctionné.

Je suis venu avec autre chose: (Courtoisie: exemples de démonstration d'API Android)

package com.example.testApp;

import Android.app.Activity;
import Android.graphics.drawable.GradientDrawable;
import Android.os.Bundle;
import Android.view.View;

public class TetApp extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        View v = findViewById(R.id.btn);
        v.setBackgroundDrawable( new DrawableGradient(new int[] { 0xff666666, 0xff111111, 0xffffffff }, 0).SetTransparency(10));

    }

    public class DrawableGradient extends GradientDrawable {
        DrawableGradient(int[] colors, int cornerRadius) {
            super(GradientDrawable.Orientation.TOP_BOTTOM, colors);

            try {
                this.setShape(GradientDrawable.RECTANGLE);
                this.setGradientType(GradientDrawable.LINEAR_GRADIENT);
                this.setCornerRadius(cornerRadius);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        public DrawableGradient SetTransparency(int transparencyPercent) {
            this.setAlpha(255 - ((255 * transparencyPercent) / 100));

            return this;
        }
    }
}
10
Yogesh

Essayez mon code ci-dessous:

 int[] colors = new int[2];
            colors[0] = getRandomColor();
            colors[1] = getRandomColor();


            GradientDrawable Gd = new GradientDrawable(
                    GradientDrawable.Orientation.TOP_BOTTOM, colors);

            Gd.setGradientType(GradientDrawable.RADIAL_GRADIENT);
            Gd.setGradientRadius(300f);
            Gd.setCornerRadius(0f);
            YourView.setBackground(Gd);

Méthode de génération de couleur aléatoire:

public static int getRandomColor(){
    Random rnd = new Random();
    return Color.argb(255, rnd.nextInt(256), rnd.nextInt(56), rnd.nextInt(256));
}
3
Rajesh.k

En fonction de vos besoins, l'utilisation de color state list au lieu d'une couleur fixe pour startColor et endColor peut faire ce que vous voulez.

0
Ted Hopp