web-dev-qa-db-fra.com

Comment changer la couleur des formes dessinables dans Android

Je développe une petite application Android dans laquelle je mets en arrière-plan une ressource pouvant être dessinée pour une mise en page linéaire. Maintenant, ce que je veux faire change la couleur d’arrière-plan de la mise en page linéaire de manière dynamique, mais dans une ressource pouvant être dessinée . Mon code ressemble à ceci:

//  bcd.xml
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">

<item>        
    <shape>
        <gradient
            Android:endColor="#22000000"
            Android:startColor="#22000000"
            Android:angle="270" />
        <stroke
            Android:width="3dp"
            Android:color="@color/white" />
        <corners
            Android:radius="3dp" />
        <padding
            Android:left="10dp"
            Android:top="10dp"
            Android:right="10dp"
            Android:bottom="10dp" />
    </shape>
</item>

<LinearLayout 
Android:id="@+id/lin_llt"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
>

et je mets en arrière plan pour la mise en page linéaire dans mon activité comme ça ...

parentLayout = (LinearLayout) view.findViewById(R.id.lin_llt);
parentLayout.setBackgroundResource(R.drawable.bcd);

Maintenant, ce que je veux faire, je veux changer la couleur de ma ressource dessinable, ce qui signifie changer la couleur de ma mise en page linéaire avec un angle arrondi et un rembourrage défini dans drawable ..

J'ai essayé ceci de la manière suivante

ShapeDrawable bgShape = (ShapeDrawable )parentLayout.getBackground();
bgShape.getPaint().setColor(Color.BLACK);

mais ça ne marche pas pour moi. toute autre solution.

Alors, comment le faire .... Besoin d'aide .... Merci.

26
nilkash

Changer dynamiquement la couleur de la mise en page

LinearLayout Layout = (LinearLayout) findViewById(R.layout.id);
Layout.setBackgroundColor(Color.parseColor("#ffffff"));

Définir dynamiquement le dégradé de couleur d'arrière-plan

View layout = findViewById(R.id.mainlayout);

GradientDrawable Gd = new GradientDrawable(
        GradientDrawable.Orientation.TOP_BOTTOM,
        new int[] {0xFF616261,0xFF131313});
Gd.setCornerRadius(0f);

layout.setBackgroundDrawable(Gd);
26
APriya

Vous pouvez essayer quelque chose comme ça:

Drawable sampleDrawable = context.getResources().getDrawable(R.drawable.balloons); 
sampleDrawable.setColorFilter(new PorterDuffColorFilter(0xffff00,PorterDuff.Mode.MULTIPLY));

et pour plus d'informations, vous pouvez vous référer à:

Comment changer les couleurs d'un Drawable dans Android?

Changer de couleur dessinable par programme

Android: Changer la couleur de la forme au moment de l'exécution

http://Pastebin.com/Hd2aU4XC

Vous pouvez aussi essayer ceci:

private static final int[] FROM_COLOR = new int[]{49, 179, 110};
private static final int THRESHOLD = 3;

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test_colors);

    ImageView iv = (ImageView) findViewById(R.id.img);
    Drawable d = getResources().getDrawable(RES);
    iv.setImageDrawable(adjust(d));
}

private Drawable adjust(Drawable d)
{
    int to = Color.RED;

    //Need to copy to ensure that the bitmap is mutable.
    Bitmap src = ((BitmapDrawable) d).getBitmap();
    Bitmap bitmap = src.copy(Bitmap.Config.ARGB_8888, true);
    for(int x = 0;x < bitmap.getWidth();x++)
        for(int y = 0;y < bitmap.getHeight();y++)
            if(match(bitmap.getPixel(x, y))) 
                bitmap.setPixel(x, y, to);

    return new BitmapDrawable(bitmap);
}

private boolean match(int pixel)
{
    //There may be a better way to match, but I wanted to do a comparison ignoring
    //transparency, so I couldn't just do a direct integer compare.
    return Math.abs(Color.red(pixel) - FROM_COLOR[0]) < THRESHOLD && Math.abs(Color.green(pixel) - FROM_COLOR[1]) < THRESHOLD && Math.abs(Color.blue(pixel) - FROM_COLOR[2]) < THRESHOLD;
}

comme indiqué dans Comment changer les couleurs d'un Drawable dans Android?

10
lokoko

utilisez ceci..

<solid Android:color="#e1e1e1" />

<stroke
    Android:width="2dp"
    Android:color="#808080" />

<corners Android:radius="10dp" />

<padding
    Android:bottom="5dp"
    Android:left="5dp"
    Android:right="5dp"
    Android:top="5dp" />

2
jigar

Une approche consisterait à créer un deuxième fichier XML pouvant être dessiné avec la deuxième couleur, puis à modifier l’arrière-plan de la présentation avec le deuxième dessin.

1
AndroidGuy

Ce qui suit est idéal pour définir la couleur du dessinable par programmation sans changer de forme:

parentLayout.getBackground().setColorFilter(
    Color.BLACK,
    PorterDuff.Mode.SRC_ATOP
);
0
DaveNOTDavid