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.