Изменяйте программный цвет с возможностью рисования
Я пытаюсь изменить цвет на белом изображении маркера по коду. Я прочитал, что код ниже должен изменить цвет, но мой маркер остается белым.
Drawable.setColorFilter( 0xffff0000, Mode.MULTIPLY )
Я что-то пропустил? Есть ли другой способ изменить цвета моих чертежей, находящихся в папке res?
Ответы
Ответ 1
Попробуй это:
Drawable unwrappedDrawable = AppCompatResources.getDrawable(context, R.drawable.my_drawable);
Drawable wrappedDrawable = DrawableCompat.wrap(unwrappedDrawable);
DrawableCompat.setTint(wrappedDrawable, Color.RED);
Использование DrawableCompat
важно, поскольку оно обеспечивает обратную совместимость и исправляет ошибки на устройствах API 22 и более ранних версиях.
Ответ 2
Вы можете попробовать это для svg vector drawable
DrawableCompat.setTint(
DrawableCompat.wrap(myImageView.getDrawable()),
ContextCompat.getColor(context, R.color.another_nice_color)
);
Ответ 3
Другой способ сделать это на Lollipop, android 5. + - установить оттенок на растровое изображение, например:
<?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"/>
Это будет работать для вас, если у вас есть ограниченное количество цветов, которые вы хотите использовать на своих чертежах. Зайдите в мой блог для получения дополнительной информации.
Ответ 4
Вам может потребоваться вызвать mutate() на drawable или все значки будут затронуты.
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);
Ответ 5
Вы можете попробовать ColorMatrixColorFilter, так как ваш цвет ключа белый:
// 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);
Ответ 6
Я написал общую функцию, в которой вы можете передать контекст, значок - это идентификатор id drawable/mipmap и новый цвет, который вам нужен для этого значка.
Эта функция возвращает выделение.
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);
Ответ 7
Вы можете попробовать это для ImageView
. используя setColorFilter()
.
imageViewIcon.setColorFilter(ContextCompat.getColor(MainActivity.this, R.color.colorWhite));
Ответ 8
Это сработало для меня. Не забудьте установить "ff" между 0x и цветовым кодом. Как это 0xff2196F3
Drawable mDrawable = ContextCompat.getDrawable(MainActivity.this,R.drawable.ic_vector_home);
mDrawable.setColorFilter(new
PorterDuffColorFilter(0xff2196F3,PorterDuff.Mode.SRC_IN));
Ответ 9
То же, что и принятый ответ, но более простой метод удобства:
val myDrawable = ContextCompat.getDrawable(context, R.drawable.my_drawable)
myDrawable.setColorFilter(Color.GREEN, PorterDuff.Mode.SRC_IN)
setCompoundDrawablesWithIntrinsicBounds(myDrawable, null, null, null)
Обратите внимание, что код здесь Kotlin.
Ответ 10
Вы можете попробовать Mode.LIGHTEN
или Mode.DARKEN
. Android Javadocs ужасно объясняют, что делают режимы PorterDuff. Вы можете посмотреть на них здесь: PorterDuff | Android
Я предлагаю посмотреть здесь на Compositing на сайте Mozilla здесь. (У них нет всех режимов, которые делают андроид, но у них много из них)
Ответ 11
Это то, что я сделал:
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;
}
Ответ 12
Просто используйте
android:drawableTint="@color/primary_color"
в вашем XML файле. Замените primary_color на пользовательский цвет
Ответ 13
Синтаксис
"your image name".setColorFilter("your context".getResources().getColor("color name"));
пример
myImage.setColorFilter(mContext.getResources().getColor(R.color.deep_blue_new));
Ответ 14
Используйте это: для Java
view.getBackground().setColorFilter(Color.parseColor("#343434"), PorterDuff.Mode.SRC_OVER)
для котлина
view.background.setColorFilter(Color.parseColor("#343434"),PorterDuff.Mode.SRC_OVER)
Вы можете использовать PorterDuff.Mode.SRC_ATOP, если ваш фон имеет закругленные углы и т.д.
Ответ 15
Создайте метод следующим образом:
//CHANGE ICON COLOR
private void changeIconColor(Context context ,int drawable){
Drawable unwrappedDrawable = AppCompatResources.getDrawable(context, drawable);
assert unwrappedDrawable != null;
Drawable wrappedDrawable = DrawableCompat.wrap(unwrappedDrawable);
DrawableCompat.setTint(wrappedDrawable, getResources().getColor(R.color.colorAccent));
}
и используйте его так:
changeIconColor(this,R.drawable.ic_home);