2013-05-02 15 views
7

Chcę zastosować kilka filtrów kolorów w łańcuchu do losowania. Czy to jest możliwe? A może utworzyć filtr, który jest kombinacją filtrów, które chcę zastosować.Zastosuj wiele filtrów kolorów do tego samego losowania

Na przykład, chciałbym:

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

Odpowiedz

6

To podejście skończyło używając: Manipulacja Drawable bitmapę na Canvas i stosuje się wiele warstw jak trzeba, używając Paint, że działa nie tylko dla filtry kolorów, ale także wszelkiego rodzaju mieszanie obrazów.

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

Zastrzeżenie:setBackgroundDrawable(Drawable d) jest przestarzała, a setBackground(Drawable d) jest dostępny tylko z api 16 na, więc jeśli masz jak ja cel min cel api-14 max api-17 trzeba nie "czysty" sposób ustaw losowanie jako tło. Przykleiłem się do przestarzałego połączenia.

Powiązane problemy