295 votes

Comment changer les couleurs d'un Drawable dans Android?

Je suis en train de travailler sur une application android, et j'ai un drawable que je suis le chargement d'une image source. Sur cette image, je voudrais convertir tous les pixels blancs d'une couleur différente, dire bleu, puis cache la résultante de l'objet Dessiné afin que je puisse l'utiliser plus tard.

Ainsi, par exemple, dire que j'ai un 20x20 fichier PNG qui a un cercle blanc au milieu, et que tout l'extérieur du cercle est transparent. Quelle est la meilleure façon de transformer ce cercle blanc bleu et de mettre en cache les résultats? La réponse de changer si je veux utiliser cette source de l'image afin de créer plusieurs nouvelles un drawable (dire bleu, rouge, vert, orange, etc)?

Je devine que je vais vouloir utiliser un ColorMatrix d'une certaine façon, mais je ne suis pas sûr de savoir comment.

234voto

thom_nic Points 1212

Je pense que vous pouvez réellement utiliser Drawable.setColorFilter( 0xffff0000, Mode.MULTIPLY ) . Cela définirait les pixels blancs en rouge mais je ne pense pas que cela affecterait les pixels transparents.

Voir Drawable # setColorFilter

157voto

Naren Points 166

Essayez ce code:

 ImageView lineColorCode = (ImageView)convertView.findViewById(R.id.line_color_code);
int color = Color.parseColor("#AE6118"); //The color u want             
lineColorCode.setColorFilter(color);
 

64voto

Mike Hill Points 151

Si vous pouvez dessiner une couleur unie et que vous souhaitez la remplacer par une couleur unie différente, vous pouvez utiliser un ColorMatrixColorFilter. La transparence est préservée.

         int iColor = Color.parseColor(color);

        int red = (iColor & 0xFF0000) / 0xFFFF;
        int green = (iColor & 0xFF00) / 0xFF;
        int blue = iColor & 0xFF;

        float[] matrix = { 0, 0, 0, 0, red
                         , 0, 0, 0, 0, green
                         , 0, 0, 0, 0, blue
                         , 0, 0, 0, 1, 0 };

        ColorFilter colorFilter = new ColorMatrixColorFilter(matrix);

        drawable.setColorFilter(colorFilter);
 

43voto

hoangtu23 Points 111

Devriez-vous cela pour toutes les API:

 Drawable myIcon = getResources().getDrawable( R.drawable.button ); 
ColorFilter filter = new LightingColorFilter( Color.BLACK, Color.BLACK);
myIcon.setColorFilter(filter);
 

31voto

Matt McMinn Points 6067

J'ai été capable de le faire avec le code suivant, qui provient d'une activité (la mise en page est très simple, contenant juste un ImageView, et n'est pas publiée ici).

 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;
}
 

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