Как настроить оттенок для просмотра изображений программно в android?

Нужно установить оттенок для представления изображения... Я использую его следующим образом:

imageView.setColorFilter(R.color.blue,android.graphics.PorterDuff.Mode.MULTIPLY);

Но это не меняется...

Ответ 1

Вы можете легко изменить оттенок в коде с помощью:

imageView.setColorFilter(Color.argb(255, 255, 255, 255)); // Белый оттенок

Если вы хотите цветовой оттенок, то

imageView.setColorFilter(ContextCompat.getColor(context, R.color.COLOR_YOUR_COLOR), android.graphics.PorterDuff.Mode.MULTIPLY);

Для векторного Drawable

imageView.setColorFilter(ContextCompat.getColor(context, R.color.COLOR_YOUR_COLOR), android.graphics.PorterDuff.Mode.SRC_IN);

ОБНОВЛЕНИЕ:
У @ADev есть более новое решение в его ответе здесь, но его решение требует более новой библиотеки поддержки - 25.4.0 или выше.

Ответ 2

Большинство ответов относятся к использованию setColorFilter, который не был изначально задан.

Пользователь @Tad имеет его ответ в правильном направлении, но он работает только с API 21 +.

Чтобы установить оттенок во всех версиях Android, используйте ImageViewCompat:

ImageViewCompat.setImageTintList(imageView, ColorStateList.valueOf(yourTint));

Обратите внимание, что yourTint в этом случае должен быть "color int". Если у вас есть ресурс цвета, например R.color.blue, сначала нужно сначала загрузить цвет int:

ContextCompat.getColor(context, R.color.blue);

Ответ 3

Это сработало для меня

mImageView.setColorFilter(ContextCompat.getColor(getContext(), R.color.green_500));

Ответ 4

@Хардик прав. Другая ошибка в вашем коде - это когда вы ссылаетесь на свой цвет, определенный XML. Вы передали только id методу setColorFilter, когда вы должны использовать идентификатор, чтобы найти ресурс цвета, и передать ресурс методу setColorFilter. Переписывая исходный код ниже.

Если эта строка находится в пределах вашей активности:

imageView.setColorFilter(getResources().getColor(R.color.blue), android.graphics.PorterDuff.Mode.MULTIPLY);

Кроме того, вам необходимо указать ваше основное действие:

Activity main = ...
imageView.setColorFilter(main.getResources().getColor(R.color.blue), android.graphics.PorterDuff.Mode.MULTIPLY);

Обратите внимание, что это также относится к другим типам ресурсов, таким как целые числа, bools, измерения и т.д. За исключением строки, для которой вы можете напрямую использовать getString() в своей деятельности без необходимости сначала звонить getResources() (не спрашивайте меня, почему).

В противном случае ваш код выглядит хорошо. (Хотя я не исследовал метод setColorFilter слишком много...)

Ответ 5

После того, как я пробовал все методы, и они не работали для меня.

Я получаю решение с помощью другого PortDuff.MODE.

imgEstadoBillete.setColorFilter(context.getResources().getColor(R.color.green),PorterDuff.Mode.SRC_IN);

Ответ 6

Начиная с леденец, есть также Оттенок метод BitmapDrawables, который работает с новым классом Palette:

public void setTintList (оттенок ColorStateList)

а также

public void setTintMode (PorterDuff.Mode tintMode)

В старых версиях Android теперь вы можете использовать библиотеку DrawableCompat

Ответ 7

Попробуй это. Он должен работать на всех версиях Android, поддерживаемых библиотекой поддержки:

public static Drawable getTintedDrawableOfColorResId(@NonNull Context context, @NonNull Bitmap inputBitmap, @ColorRes int colorResId) {
    return getTintedDrawable(context, new BitmapDrawable(context.getResources(), inputBitmap), ContextCompat.getColor(context, colorResId));
}

public static Drawable getTintedDrawable(@NonNull Context context, @NonNull Bitmap inputBitmap, @ColorInt int color) {
    return getTintedDrawable(context, new BitmapDrawable(context.getResources(), inputBitmap), color);
}

public static Drawable getTintedDrawable(@NonNull Context context, @NonNull Drawable inputDrawable, @ColorInt int color) {
    Drawable wrapDrawable = DrawableCompat.wrap(inputDrawable);
    DrawableCompat.setTint(wrapDrawable, color);
    DrawableCompat.setTintMode(wrapDrawable, PorterDuff.Mode.SRC_IN);
    return wrapDrawable;
}

Вы можете использовать любой из вышеперечисленных функций, чтобы заставить его работать.

Вы можете прочитать о более интересных особенностей DrawableCompat на документы, здесь.

Ответ 8

Простая и одна строка

imageView.setColorFilter(activity.getResources().getColor(R.color.your_color));

Ответ 9

Начиная с Lollipop существует метод, называемый ImageView#setImageTintList() который вы можете использовать... Преимущество состоит в том, что для него требуется ColorStateList а не только один цвет, что делает отображение ColorStateList в соответствии с цветом.

На устройствах с предустановленной Lollipop вы можете получить такое же поведение, показывая выделение, а затем установите его как графическое изображение ImageView:

ColorStateList csl = AppCompatResources.getColorStateList(context, R.color.my_clr_selector);
Drawable drawable = DrawableCompat.wrap(imageView.getDrawable());
DrawableCompat.setTintList(drawable, csl);
imageView.setImageDrawable(drawable);

Ответ 10

Random random=new Random;
ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
ColorFilter cf = new PorterDuffColorFilter(Color.rgb(random.nextInt(255), random.nextInt(255), random.nextInt(255)),Mode.OVERLAY);

imageView.setImageResource(R.drawable.ic_bg_box);
imageView.setColorFilter(cf);

Ответ 11

Поскольку первый ответ не сработал у меня:

//get ImageView
ImageView myImageView = (ImageView) findViewById(R.id.iv);

//colorid is the id of a color defined in values/colors.xml
myImageView.setImageTintList(ColorStateList.valueOf(ContextCompat.getColor(getApplicationContext(), R.color.colorid)));

Это похоже, похоже, работает в API 21+, но для меня это не проблема. Вы можете использовать ImageViewCompat для решения этой проблемы, tho.

Надеюсь, я помог кому-нибудь: -)

Ответ 12

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

ImageViewCompat.setImageTintMode(img,PorterDuff.Mode.SRC_ATOP);
ImageViewCompat.setImageTintList(img,ColorStateList.valueOf(Color.parseColor("#80000000")));

Чтобы очистить оттенок

ImageViewCompat.setImageTintList(img, null);

Ответ 13

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

mImageView.setEnabled(true);

XML:

 <ImageView
            android:id="@+id/image_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_arrowup"
            android:tint="@color/section_arrowup_color"
            />

section_arrowup_color.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@android:color/white" android:state_enabled="true"/>
    <item android:color="@android:color/black" android:state_enabled="false"/>
    <item android:color="@android:color/white"/>
</selector>

Ответ 14

Не используйте PoterDuff.Mode, используйте setColorFilter() он работает для всех.

ImageView imageView = (ImageView) listItem.findViewById(R.id.imageView);
imageView.setColorFilter(getContext().getResources().getColor(R.color.msg_read));

Ответ 15

Как сказал @milosmns, вы должны использовать imageView.setColorFilter(getResouces().getColor(R.color.blue),android.graphics.PorterDuff.Mode.MULTIPLY);

Для этого API требуется значение цвета вместо идентификатора ресурса цвета. Это основная причина, почему ваш оператор не работает.

Ответ 16

Я опаздываю на вечеринку, но я не видел своего решения выше. Мы также можем установить оттенок цвета с помощью setImageResource() (мой minSdkVersion равен 24).

Итак, во-первых, вам нужно создать селектор и сохранить его в папке ресурсов /drawable (я называю это ic_color_white_green_search.xml)

<!-- Focused and not pressed -->
<item android:state_focused="true"
      android:state_pressed="false">

    <bitmap android:src="@drawable/ic_search"
            android:tint="@color/branding_green"/>
</item>

<!-- Focused and pressed -->
<item android:state_focused="true"
      android:state_pressed="true">

    <bitmap android:src="@drawable/ic_search"
            android:tint="@color/branding_green"/>
</item>

<!-- Default -->
<item android:drawable="@drawable/ic_search"/>

Затем установите его в коде так:

val icon = itemView.findViewById(R.id.icon) as ImageButton
icon.setImageResource(R.drawable.ic_color_white_green_search)

Ответ 17

Добавление к ADev ответа (что на мой взгляд является наиболее правильным), начиная с широкого распространения Kotlin, и его полезных функций расширения:

fun ImageView.setTint(context: Context, @ColorRes colorId: Int) {
    val color = ContextCompat.getColor(context, colorId)
    val colorStateList = ColorStateList.valueOf(color)
    ImageViewCompat.setImageTintList(this, colorStateList)
}

Я думаю, что эта функция может быть полезна в любом проекте Android!

Ответ 18

Для установки оттенка для просмотра изображений программно в Android

У меня есть два метода для Android:

1)

imgView.setColorFilter(context.getResources().getColor(R.color.blue));

2)

 DrawableCompat.setTint(imgView.getDrawable(),
                     ContextCompat.getColor(context, R.color.blue));

Я надеюсь, что я помог никому :-)

Ответ 19

Лучшая упрощенная функция расширения благодаря ADev

fun ImageView.setTint(@ColorRes colorRes: Int) {
    ImageViewCompat.setImageTintList(this, ColorStateList.valueOf(ContextCompat.getColor(context, colorRes)))
}

Использование:-

imageView.setTint(R.color.tintColor)

Ответ 20

Если вы хотите установить селектор на ваш оттенок:

ImageViewCompat.setImageTintList(iv, getResources().getColorStateList(R.color.app_icon_click_color));

Ответ 21

Просто добавьте, если вы хотите удалить существующий оттенок, вы можете установить его в прозрачный цвет:

mSignInButton.setColorFilter(Color.TRANSPARENT);

Ответ 22

Неточный ответ, но более простая альтернатива:

  • Поместите другой вид поверх изображения
  • Измените значение альфа, но вы хотите (программно) получить желаемый эффект.

Вот фрагмент для этого:

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="@dimen/height120"
        android:contentDescription="@string/my_description"
        android:scaleType="fitXY"
        android:src="@drawable/my_awesome_image"/>

    <View
        android:layout_width="match_parent"
        android:layout_height="@dimen/height120"
        android:alpha="0.5"
        android:background="@color/my_blue_color"/>
</FrameLayout>