Як налаштувати відтінок для перегляду зображення програмно в Android?


396

Потрібно встановити відтінок для перегляду зображення ... Я використовую його наступним чином:

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

Але це не змінюється ...


15
Можливо, ви використовували цілий ідентифікатор ресурсу замість цілого значення кольору, спробуйте перетворити R.color.blue в getResources (). GetColor (R.color.blue)
— milosmns

Dravable Dravable = ...; dravable.setColorFilter (ContextCompat.getColor (контекст, R.color.white), PorterDuff.Mode.DST); imageView.setImageDravable (малюється); // тут можна використовувати будь-який колір
— полум'я3

Відповіді:


916

Ви можете змінити відтінок, досить легко в коді за допомогою:

imageView.setColorFilter(Color.argb(255, 255, 255, 255)); // Білий відтінок

Якщо ви хочете кольоровий відтінок, тоді

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

Для векторного малювання

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

UPDATE :
@ADev має більш нове рішення в своїй відповіді тут , але його рішення вимагає більш нової бібліотеки підтримки - 25.4.0 або вище.



12
У xml, android: tint = "@ color / blue"
— Луїс

1
Плюс android: відтінок
— 21+

8
android:tintпрацює на всіх версіях Android. Може, ти говориш про це drawableTint?
— фінстас

11
PorterDuff.Mode.MULTIPLY не працює в моїй ситуації, я використовував PorterDuff.Mode.SRC_IN, і це працює
— Mohamed Nageh

234

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

Користувач @Tad має свою відповідь у правильному напрямку, але він працює лише в API 21+.

Щоб встановити відтінок для всіх версій Android, використовуйте ImageViewCompat:

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

Зауважте, що yourTintв цьому випадку повинен бути "кольоровий int". Якщо у вас є такий колірний ресурс R.color.blue, потрібно спочатку завантажити int color:

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

6
Повинна бути прийнята відповідь. Зауважте, що він працює лише в ImageViewекземплярах xml з темою AppCompat або на AppCompatImageViewпідкласах.
— Луї CAD

1
@ADev оцінює ваше рішення, але питання було задано у 2013 році та випуску ImageViewCompat та AppCompatImageView з v4 підтримкою lib 25.4.0 у червні 2017 року та 25.1.0 грудня 2016 року відповідно :)
— Hardik

1
@ADev звичайно, але ви не вказали це належним чином у своїй відповіді, що ваше рішення нове та потребує новішої бібліотеки підтримки 25.4.0 і вище, тому що з нижчою версією підтримки lib цей клас недоступний, тому ніхто не може його знайти !! !! до речі, я відредагував відповідь :) добрий день ...
— Хардік

Це не працює в API 16.
— Tayyab Mazhar

49

Це працювало для мене

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

так, працював і для мене, без другого параметра. Він також може mImageView.setColorFilter(getContext().getResources().getColor(R.color.green_500));
— піти

прихильний і без другого параметра, він працює як шарм. Thx @ toobsco42
— Раві Ванія

35

@Hardik має право. Інша помилка у вашому коді полягає у посиланні на ваш визначений XML колір. Ви пройшли тільки ідентифікатор до 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);

Зауважте, що це стосується й інших типів ресурсів, таких як цілі числа, булі, розміри тощо. За винятком рядка, для якого ви можете безпосередньо використовуватись getString()у своїй діяльності без необхідності першого дзвінка getResources()(не питайте мене чому) .

Інакше ваш код виглядає добре. (Хоча я setColorFilterзанадто багато не досліджував метод ...)


22

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

Я отримую рішення за допомогою іншого PortDuff.MODE.

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

14

Починаючи з Lollipop, існує також метод відтінку для BitmapDrawables, який працює з новим класом Palette:

public void setTintList (відтінок ColorStateList)

і

public void setTintMode (PorterDuff.Mode tintMode)

На старих версіях Android тепер ви можете використовувати бібліотеку DravableCompat


2
насправді бібліотека підтримки її підтримує. дивіться мою відповідь: stackoverflow.com/a/34479043/878126
— андроїд розробник

12

Спробуйте це. Він повинен працювати на всіх версіях 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;
}

Ви можете скористатися будь-яким із перерахованих вище, щоб він працював.

Про більш цікаві функції DravableCompat ви можете прочитати на документах тут .


1
Я також повинен був зробити, imageView.getBackground()щоб отримати тестування, тому що imageView.getDrawable()повертався недійсним.
— Рок Лі

@RockLee будьте впевнені, що ви використовували src для перегляду зображень xml або setImageResource у коді
— orelzion

це ідеальний спосіб встановити колір відтінку для тла перегляду зображень
— leegor

12

Краще спрощена функція розширення завдяки ADev

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

Використання: -

imageView.setTint(R.color.tintColor)

Чи є подібний для відтінку тексту / кнопки TextView?
— андроїд розробник

Ви маєте на увазі колір або відтінок тексту для перегляду тексту для малювання тексту?
— Манохар Редді

Я маю на увазі "відтінок тексту". Колір тексту. Але я думаю, що це досить проблематично, оскільки текст має колір для кожного стану ... Потім знову, як це добре працює, коли я встановлюю колір акценту ... Незвичайно .... Чи можливо встановити колір наголосу на конкретна кнопка (або TextView), програмно?
— андроїд розробник

11

Якщо ваш колір має шістнадцяткову прозорість, використовуйте наведений нижче код.

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

Щоб очистити відтінок

ImageViewCompat.setImageTintList(imageView, null);

що таке тип "img"
— Beyaz

1
@Beyaz imgтипу ImageView.
— Сай


9

Оскільки перша відповідь не спрацювала для мене:

//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 для вирішення цієї проблеми, тхо.

Я сподіваюся, що я комусь допоміг :-)


7

Починаючи з Lollipop, існує метод, який називається, ImageView#setImageTintList()який ви можете використовувати ... перевагою є те, що це потрібно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);

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

6

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

У мене є два методи для андроїда:

1)

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

2)

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

Я сподіваюся, що я комусь допоміг :-)


4

Додавання до ADEV «s відповідь (який , на мою думку , є найбільш правильним), оскільки широке впровадження Котлін, і його корисних функцій розширення:

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

Я думаю, що це функція, яка може бути корисною в будь-якому Android-проекті!


4

Я виявив, що ми можемо використовувати селектор кольорів для attr відтінку:

mImageView.setEnabled(true);

Activity_main.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>

Привіт, це не працює для векторних витратних матеріалів. Будь-яке рішення для того ж?
— Манукумар

@Manukumar Використовуйте app:srcCompatзамість цього android:srcі додайте vectorDrawables.useSupportLibrary = trueдо defaultConfigчастини свого файлу build.gradle. Випробувано, щоб добре працювати на емуляторі Kitkat.
— андроїд розробник

3

Не використовуйте PoterDuff.Mode, Використовуйте setColorFilter()це працює для всіх.

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

2

Як сказав @milosmns, вам слід скористатися imageView.setColorFilter(getResouces().getColor(R.color.blue),android.graphics.PorterDuff.Mode.MULTIPLY);

Цей API потребує значення кольору замість ідентифікатора ресурсу кольорів. Це першопричина, чому ваше повідомлення не працює.


2

Я запізнююсь на партію, але я не бачив свого рішення. Ми можемо встановити колір відтінку за допомогою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)


0

Рішення Котліна за допомогою функції розширення для встановлення та зняття тонування:

fun ImageView.setTint(@ColorInt color: Int?) {
    if (color == null) {
        ImageViewCompat.setImageTintList(this, null)
        return
    }
    ImageViewCompat.setImageTintMode(this, PorterDuff.Mode.SRC_ATOP)
    ImageViewCompat.setImageTintList(this, ColorStateList.valueOf(color))
}

-4

Не точна відповідь, але простіша альтернатива:

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

Ось фрагмент для цього:

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

це про відтінок! не альфа, що є для прозорості.
— Девід

Але це в підсумку діє як відтінок. Спробуйте спробувати самостійно. Це лише один спосіб дивитися на речі.
— Shubham Chaudhary

@ShubhamChaudhary Я знаю, що це пізно, але що робити, якщо це зображення png. Тоді не зміниться фон? Також Альфа і відтінок дуже різні. Відтінок - це як заміна кольору, якщо я не помиляюся. Жодного правопорушення не передбачалося. Просто намагаюся допомогти :)
— KISHORE_ZE

Дійсна точка. Ця відповідь допомогла в моєму випадку. Надія підходить і для чужого взуття.
— Shubham Chaudhary
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.