2013-05-02 2 views
7

Je souhaite appliquer plusieurs filtres de couleur dans la chaîne à un dessin. Est-ce possible? Ou peut-être pour créer un filtre qui est la combinaison des filtres que je veux appliquer.Appliquer plusieurs filtres de couleur au même dessin

Par exemple, je voudrais:

Drawable d = ...; 
d.setColorFilter(0x3F000000, Mode.OVERLAY).setColorFilter(0xFF2D2D2D, Mode.SCREEN) 

Répondre

6

Telle est l'approche que j'ai fini en utilisant: Manipulez le bitmap Drawable sur un Canvas et d'appliquer autant de couches que j'ai besoin, en utilisant Paint, cela fonctionne non seulement pour filtres de couleur, mais aussi pour tout type de mélange d'images.

... 
Drawable myBackground = createBackground(getResources().getColor(R.color.Green)); 
setBackgroundDrawable(myBackground); 
... 

private Drawable createBackground(int color) { 

    Canvas canvas = new Canvas(); 
    Bitmap buttonImage = BitmapFactory.decodeResource(getResources(), R.drawable.btn_image); 
    Bitmap buttonShadows = BitmapFactory.decodeResource(getResources(), R.drawable.btn_shadows); 
    Bitmap buttonHighLights = BitmapFactory.decodeResource(getResources(), R.drawable.btn_highlights); 
    Bitmap result = Bitmap.createBitmap(buttonImage.getWidth(), buttonImage.getHeight(), Bitmap.Config.ARGB_8888); 

    canvas.setBitmap(result); 
    Paint paint = new Paint(); 
    paint.setFilterBitmap(false); 

    // Color 
    paint.setColorFilter(new PorterDuffColorFilter(color, Mode.MULTIPLY)); 
    canvas.drawBitmap(buttonImage, 0, 0, paint); 
    paint.setColorFilter(null); 
    // Shadows 
    paint.setXfermode(new PorterDuffXfermode(Mode.MULTIPLY)); 
    canvas.drawBitmap(buttonShadows, 0, 0, paint); 
    // HighLights 
    paint.setXfermode(new PorterDuffXfermode(Mode.SCREEN)); 
    canvas.drawBitmap(buttonHighLights, 0, 0, paint); 

    paint.setXfermode(null); 
    return new BitmapDrawable(getResources(), result); 
} 

caveat:setBackgroundDrawable(Drawable d) est ainsi dépréciée, alors que setBackground(Drawable d) est uniquement disponible à partir api 16, donc si vous avez comme moi un min cible api-14 cible max api-17 vous avez pas "propre" définissez l'élément dessinable en arrière-plan. J'ai collé avec l'appel désapprouvé.

Questions connexes