2013-05-02 18 views
7

Çeşitli renk filtrelerini zincire takılabilir olarak uygulamak istiyorum. Mümkün mü? Ya da belki uygulamak istediğim filtrelerin kombinasyonu olan bir filtre oluşturmak.Aynı çekilebilen çok sayıda renk filtresi uygulayın

Örneğin, ben istiyorum:

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

cevap

6

Bu benim kullandığım erdi yaklaşımdır: Bir Canvas üzerine Drawable bitmap işleyin ve ihtiyacım olduğu kadar çok katmanları uygulamak, Paint kullanarak, bu sadece çalışır Renk filtreleri, aynı zamanda her türlü görüntü karışımı için.

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

Uyarı:setBackgroundDrawable(Drawable d)setBackground(Drawable d) üzerinde API 16 sadece mevcut iken, kullanımdan kaldırıldı, böylece edilir benim gibi hiçbir "temiz" bir yol var api-14 max hedef api-17 dk hedefi varsa Çizilebilirliği arka plan olarak ayarlayın. Kullanımdan kaldırılmış çağrıya bağlı kaldım.

İlgili konular