oreo - android pie
Cambia el color dibujable programáticamente (12)
Estoy tratando de cambiar el color en una imagen de marcador blanco por código. He leído que el código a continuación debería cambiar el color, pero mi marcador permanece en blanco.
Drawable.setColorFilter( 0xffff0000, Mode.MULTIPLY )
¿Me he perdido algo? ¿Hay alguna otra forma de cambiar los colores en mis dibujables ubicados en mi carpeta de res?
Es posible que deba llamar a mutate () en el dibujo o, de lo contrario, todos los iconos se verán afectados.
Drawable icon = ContextCompat.getDrawable(getContext(), R.drawable.ic_my_icon).mutate();
TypedValue typedValue = new TypedValue();
getContext().getTheme().resolveAttribute(R.attr.colorIcon, typedValue, true);
icon.setColorFilter(typedValue.data, PorterDuff.Mode.SRC_ATOP);
Es posible que desee probar Mode.LIGHTEN
o Mode.DARKEN
. Los Javadocs de Android son horribles al explicar lo que hacen los modos PorterDuff. Puede echarles un vistazo aquí: PorterDuff | Androide
Sugiero mirar alrededor de Compositing en el sitio de Mozilla here. (No tienen todos los modos que usa Android, pero tienen muchos de ellos)
Esto es lo que hice:
public static Drawable changeDrawableColor(int drawableRes, int colorRes, Context context) {
//Convert drawable res to bitmap
final Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), drawableRes);
final Bitmap resultBitmap = Bitmap.createBitmap(bitmap, 0, 0,
bitmap.getWidth() - 1, bitmap.getHeight() - 1);
final Paint p = new Paint();
final Canvas canvas = new Canvas(resultBitmap);
canvas.drawBitmap(resultBitmap, 0, 0, p);
//Create new drawable based on bitmap
final Drawable drawable = new BitmapDrawable(context.getResources(), resultBitmap);
drawable.setColorFilter(new
PorterDuffColorFilter(context.getResources().getColor(colorRes), PorterDuff.Mode.MULTIPLY));
return drawable;
}
Esto funcionó para mí. Asegúrese de poner "ff" entre 0x y el código de color. Me gusta esto 0xff2196F3
Drawable mDrawable = ContextCompat.getDrawable(MainActivity.this,R.drawable.ic_vector_home);
mDrawable.setColorFilter(new
PorterDuffColorFilter(0xff2196F3,PorterDuff.Mode.SRC_IN));
He escrito una función genérica en la que puedes pasar el contexto, el ícono es el ícono de id sorteable / imagen de mipmap y el nuevo color que necesitas para ese ícono.
Esta función devuelve un dibujable.
public static Drawable changeDrawableColor(Context context,int icon, int newColor) {
Drawable mDrawable = ContextCompat.getDrawable(context, icon).mutate();
mDrawable.setColorFilter(new PorterDuffColorFilter(newColor, PorterDuff.Mode.SRC_IN));
return mDrawable;
}
changeDrawableColor(getContext(),R.mipmap.ic_action_tune, Color.WHITE);
Igual que la respuesta aceptada pero un método de conveniencia más simple:
val myDrawable = ContextCompat.getDrawable(context, R.drawable.my_drawable)
myDrawable.setColorFilter(Color.GREEN, PorterDuff.Mode.SRC_IN)
setCompoundDrawablesWithIntrinsicBounds(myDrawable, null, null, null)
Tenga en cuenta que el código aquí es Kotlin.
Otra forma de hacer esto en Lollipop, Android 5. + es establecer un tinte en un mapa de bits dibujable como tal:
<?xml version="1.0" encoding="utf-8"?>
<bitmap
xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/ic_back"
android:tint="@color/red_tint"/>
Esto funcionará para usted si tiene una cantidad limitada de colores que desea usar en sus artículos descartables. Echa un vistazo a la publicación de mi blog para más información .
Puede probar ColorMatrixColorFilter, ya que el color de su clave es blanco:
// Assuming "color" is your target color
float r = Color.red(color) / 255f;
float g = Color.green(color) / 255f;
float b = Color.blue(color) / 255f;
ColorMatrix cm = new ColorMatrix(new float[] {
// Change red channel
r, 0, 0, 0, 0,
// Change green channel
0, g, 0, 0, 0,
// Change blue channel
0, 0, b, 0, 0,
// Keep alpha channel
0, 0, 0, 1, 0,
});
ColorMatrixColorFilter cf = new ColorMatrixColorFilter(cm);
myDrawable.setColorFilter(cf);
Puedes probar esto para ImageView. usando setColorFilter ().
imageViewIcon.setColorFilter(ContextCompat.getColor(MainActivity.this, R.color.colorWhite));
Simplemente usa
android:drawableTint="@color/primary_color"
en su archivo XML. Reemplace primary_color por color personalizado
prueba esto:
Drawable mDrawable = context.getResources().getDrawable(R.drawable.balloons);
mDrawable.setColorFilter(new
PorterDuffColorFilter(0xffff00,PorterDuff.Mode.MULTIPLY));
Editar: getDrawable(int id)
está en desuso en la versión actual de Android.
Use ContextCompat.getDrawable(context, R.drawable.balloons);
para este ejemplo.
puedes probar esto para svg vector drawable
DrawableCompat.setTint(myImageView.getDrawable(), ContextCompat.getColor(context, R.color.another_nice_color));