Aplique muchos filtros de color a la misma
Quiero aplicar varios filtros de color en la cadena a un dibujable. ¿Es eso posible? O tal vez para crear un filtro que es la combinación de los filtros que quiero aplicar.
Por ejemplo, me gustaría:
Drawable d = ...; d.setColorFilter(0x3F000000, Mode.OVERLAY).setColorFilter(0xFF2D2D2D, Mode.SCREEN)
Este es el enfoque que terminé usando: Manipular el mapa de bits Drawable
en un Canvas
y aplicar tantas capas como sea necesario, usando Paint
, funciona no sólo para filtros de color, sino también para cualquier tipo de mezcla de imágenes.
... 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); }
Advertencia: setBackgroundDrawable(Drawable d)
está obsoleta, mientras que setBackground(Drawable d)
sólo está disponible en api 16, por lo que si tienes como yo un objetivo min api-14 max target api-17 no tienes una manera "limpia" de establecer El dibujable como fondo. Me quedé con la llamada obsoleta.