Измените цвет рисования программно

Я пытаюсь изменить цвет белого изображения маркера по коду. Я прочитал, что код ниже должен изменить цвет, но мой маркер остается белым.

Drawable.setColorFilter( 0xffff0000, Mode.MULTIPLY )

Я что-то пропустил? Есть ли другой способ изменить цвета на моих чертежах, расположенных в папке res?

21 ответ

Решение

Попробуй это:

Drawable mDrawable = context.getResources().getDrawable(R.drawable.balloons); 
mDrawable.setColorFilter(new 
PorterDuffColorFilter(0xffff00,PorterDuff.Mode.MULTIPLY));

Редактировать: getDrawable(int id) устарела в текущей версии Android.

использование ContextCompat.getDrawable(context, R.drawable.balloons); для этого примера.

Вы можете попробовать это для svg vector drawable

DrawableCompat.setTint(myImageView.getDrawable(), ContextCompat.getColor(context, R.color.another_nice_color));

Возможно, вам понадобится вызвать mutate() для рисования, иначе все значки будут затронуты.

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);

Вы можете попробовать это для ImageView, с помощью setColorFilter(),

imageViewIcon.setColorFilter(ContextCompat.getColor(MainActivity.this, R.color.colorWhite));

Еще один способ сделать это на 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"/>

Это будет работать для вас, если у вас есть ограниченное количество цветов, которые вы хотите использовать в ваших рисунках. Проверьте мой блог для получения дополнительной информации.

Я написал обобщенную функцию, в которой вы можете передавать контекст, icon is id drawable/mipmap image icon и новый цвет, который вам нужен для этой иконки.

Эта функция возвращает рисование.

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);

Это сработало для меня. Убедитесь, что вы поставили "ff" между 0x и кодом цвета. Мне нравится 0xff2196F3

Drawable mDrawable = ContextCompat.getDrawable(MainActivity.this,R.drawable.ic_vector_home);
                    mDrawable.setColorFilter(new
                            PorterDuffColorFilter(0xff2196F3,PorterDuff.Mode.SRC_IN));

Вы можете попробовать 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);

То же, что принятый ответ, но более простой метод удобства:

val myDrawable = ContextCompat.getDrawable(context, R.drawable.my_drawable)
myDrawable.setColorFilter(Color.GREEN, PorterDuff.Mode.SRC_IN)
setCompoundDrawablesWithIntrinsicBounds(myDrawable, null, null, null)

Обратите внимание, код здесь Kotlin.

Для тех, кто использует Kotlin, простая функция расширения:

fun Drawable.tint(context: Context,  @ColorRes color: Int) {
    DrawableCompat.setTint(this, context.resources.getColor(color, context.theme))
}

а потом просто сделай

background.tint(context, R.color.colorPrimary)

Используйте это: для 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, если ваш фон имеет закругленные углы и т. д.

Вы можете изменить свой цвет для рисования следующим образом:

      background = view.findViewById(R.id.background)

val uDrawable = AppCompatResources.getDrawable(view.context, R.drawable.background)
uDrawable?.let {
      val wDrawable = DrawableCompat.wrap(it)
      DrawableCompat.setTint(wDrawable, ContextCompat.getColor(view.context, 
                                                      color /*specify your int color code*/))
      background.background = wDrawable
}

Вы можете попробовать Mode.LIGHTEN или же Mode.DARKEN, Android Javadocs ужасно объясняют, что делают режимы PorterDuff. Вы можете посмотреть их здесь: PorterDuff | Android

Я предлагаю посмотреть на Compositing на сайте Mozilla здесь. (У них нет всех режимов, которые есть у Android, но их много)

SDK>= 21 одна строка myIconImageView.getDrawable(). SetTint(getResources(). GetColor(myColor))

Прежде всего:

Синтекс -:

"your image name".setColorFilter("your context".getResources().getColor("color name"));

Пример -:

myImage.setColorFilter(mContext.getResources().getColor(R.color.deep_blue_new));

Просто использовать

    android:drawableTint="@color/primary_color"

в вашем XML-файле. Замените primary_color на пользовательский цвет

Котлин Версия

      val unwrappedDrawable =
            AppCompatResources.getDrawable(this, R.drawable.your_drawable)
        val wrappedDrawable = DrawableCompat.wrap(unwrappedDrawable!!)
DrawableCompat.setTint(wrappedDrawable, Color.RED)

Вот что я сделал:

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;
}

Создайте такой метод:

//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);

Самый простой способ сделать это:

imageView.setColorFilter(Color.rgb(r, g b));

или

imageView.setColorFilter(Color.argb(a, r, g, b));

a, r, g, b: значения argb цвета.

Короче :

      public void changeDrawableColor(Drawable drawable,int color){
    drawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
}

      public Drawable getColoredDrawable(@DrawableRes int resid,int color){
    Drawable drawable= ContextCompat.getDrawable(context, resid).mutate();
    drawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
    return drawable;
}
Другие вопросы по тегам