2013-05-02 9 views
7

Ich möchte mehrere Farbfilter in der Kette auf ein Zeichen anwenden. Ist das möglich? Oder vielleicht, um einen Filter zu erstellen, der die Kombination der Filter ist, die ich anwenden möchte.Wenden Sie viele Farbfilter auf das gleiche Zeichen an

Zum Beispiel würde Ich mag:

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

Antwort

6

Dies ist der Ansatz, den ich mit beendet: Manipulieren der Drawable Bitmap auf einem Canvas und gelten so viele Schichten wie ich brauche, Paint verwenden, es funktioniert nicht nur für Farbfilter, aber auch für jede Art von Bildüberblendung.

... 
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) ist veraltet, während setBackground(Drawable d) nur von api 16 auf, verfügbar ist so, wenn Sie wie ich haben eine min Ziel api-14 max Ziel api-17 haben Sie keine "saubere" Art und Weise müssen Legen Sie das Zeichen als Hintergrund fest. Ich habe mich an den veralteten Anruf gehalten.