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