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.