Возможно, вы использовали целочисленный идентификатор ресурса вместо целочисленного значения цвета, попробуйте преобразовать R.color.blue в getResources (). GetColor (R.color.blue)
milosmns
Drawable Drawable = ...; drawable.setColorFilter (ContextCompat.getColor (context, R.color.white), PorterDuff.Mode.DST); imageView.setImageDrawable (вытяжка); // здесь можно использовать любой цвет
flame3
Ответы:
918
Вы можете легко изменить оттенок в коде с помощью:
imageView.setColorFilter(Color.argb(255, 255, 255, 255)); // Белый оттенок
Обратите внимание, что yourTintв этом случае должен быть «цвет int». Если у вас есть такой цветовой ресурс R.color.blue, вам нужно сначала загрузить цвет int:
Должен быть принятый ответ. Обратите внимание, что он работает только на ImageViewэкземплярах XML с темой AppCompat или на AppCompatImageViewподклассах.
Louis CAD
1
@ADev признателен за ваше решение, но вопрос был задан в 2013 году и выпуски ImageViewCompat и AppCompatImageView с версией v4 lib 25.4.0 в июне 2017 года и 25.1.0 декабря 2016 года соответственно :)
Hardik
1
@ADev, конечно, но вы не упомянули правильно в своем ответе, что ваше решение является новым и требует более новой библиотеки поддержки 25.4.0 и выше, потому что с более низкой версией поддержки lib этот класс недоступен, поэтому никто не мог его найти !! !! кстати я отредактировал ответ :) добрый день ...
да, у меня тоже сработало, без второго параметра .. может тоже идетmImageView.setColorFilter(getContext().getResources().getColor(R.color.green_500));
Бискрем Мухаммед
проголосовал и без второго параметра, он работает как шарм. Thx @ toobsco42
Рави Вания
35
@ Хардик это правильно. Другая ошибка в вашем коде - это когда вы ссылаетесь на свой определенный XML цвет. Вы прошли только идентификатор к setColorFilterспособу, когда вы должны использовать идентификатор , чтобы найти цвет ресурс и передать ресурс к setColorFilterметоду. Переписав свой оригинальный код ниже.
Иначе, вам нужно указать свою основную деятельность:
Activity main =...
imageView.setColorFilter(main.getResources().getColor(R.color.blue), android.graphics.PorterDuff.Mode.MULTIPLY);
Обратите внимание, что это также относится и к другим типам ресурсов, таким как целые числа, bools, измерения и т. Д. За исключением строки, которую вы можете напрямую использовать getString()в своей Деятельности без необходимости первого вызова getResources()(не спрашивайте меня, почему) ,
В противном случае ваш код выглядит хорошо. (Хотя я не слишком исследовал setColorFilterметод ...)
Лучшая упрощенная функция расширения благодаря ADev
fun ImageView.setTint(@ColorRes colorRes:Int){ImageViewCompat.setImageTintList(this,ColorStateList.valueOf(ContextCompat.getColor(context, colorRes)))}
Есть ли аналогичный для оттенка текста Button / TextView?
разработчик Android
Вы имеете в виду текстовый цвет textview или оттенок для textview?
Манохар Редди
Я имею в виду «текстовый оттенок». Цвет текста. Но я думаю, что это довольно проблематично, так как текст имеет цвет для каждого состояния ... Опять же, как получается, что он прекрасно работает, когда я устанавливаю цвет акцента ... Странно ... Возможно ли установить цвет акцента на конкретная кнопка (или TextView), программно?
разработчик Android
12
Попробуй это. Он должен работать на всех версиях Android, которые поддерживает библиотека поддержки:
//get ImageViewImageView 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 для решения этой проблемы, хотя.
Начиная с Lollipop, существует метод, ImageView#setImageTintList()который вы можете использовать ... преимущество в том, что он требуетColorStateList а не только один цвет, таким образом, делая оттенок изображения чувствительным к состоянию.
На устройствах, предшествующих Lollipop, вы можете получить то же поведение, подкрашивая нарисованный объект, а затем устанавливая его как ImageViewрисунок для рисования:
Добавление к 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!
Привет, это не работает для векторных объектов. Любой обходной путь для того же?
Манукумар
@Manukumar Используйте app:srcCompatвместо android:srcи добавьте vectorDrawables.useSupportLibrary = trueв свою defaultConfigчасть файла build.gradle. Протестировано для работы на эмуляторе Kitkat.
Android-разработчик
3
Не используйте PoterDuff.Mode, используйте setColorFilter()это работает для всех.
Я опаздываю на вечеринку, но я не видел своего решения выше. Мы также можем установить оттенок цвета setImageResource()(мой minSdkVersion равен 24).
Итак, во-первых, вам нужно создать селектор и сохранить его в /drawableпапке активов (я называю это ic_color_white_green_search.xml)
<!-- Focused and not pressed --><itemandroid:state_focused="true"android:state_pressed="false"><bitmapandroid:src="@drawable/ic_search"android:tint="@color/branding_green"/></item><!-- Focused and pressed --><itemandroid:state_focused="true"android:state_pressed="true"><bitmapandroid:src="@drawable/ic_search"android:tint="@color/branding_green"/></item><!-- Default --><itemandroid:drawable="@drawable/ic_search"/>
Затем установите его в коде так:
val icon = itemView.findViewById(R.id.icon)asImageButton
icon.setImageResource(R.drawable.ic_color_white_green_search)
Решение Kotlin с использованием функции расширения для установки и отмены тонирования:
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))}
Но это в конечном итоге действует как оттенок. Вы должны попробовать это сами. Это всего лишь один из способов взглянуть на вещи.
Шубхам Чаудхари
@ShubhamChaudhary Я знаю, что уже поздно, но что, если изображение png. Тогда не изменится ли фон? Также альфа и оттенок очень разные. Оттенок - это как замена цвета, если я не ошибаюсь. Без обид. Просто пытаюсь помочь :)
KISHORE_ZE
Действительная точка. Этот ответ помог в моем случае. Надежда подходит и к чужой обуви.
Ответы:
Вы можете легко изменить оттенок в коде с помощью:
imageView.setColorFilter(Color.argb(255, 255, 255, 255));
// Белый оттенокЕсли вы хотите цветовой оттенок, то
Для векторного Drawable
ОБНОВЛЕНИЕ :
@ADev имеет более новое решение в своем ответе здесь , но его решение требует более новой библиотеки поддержки - 25.4.0 или выше.
источник
android:tint
работает на всех версиях Android. Может ты о чемdrawableTint
?Большинство ответов относятся к использованию,
setColorFilter
а не к тому, что было задано изначально.Пользователь @Tad имеет свой ответ в правильном направлении, но он работает только на API 21+.
Чтобы установить оттенок на всех версиях Android, используйте
ImageViewCompat
:Обратите внимание, что
yourTint
в этом случае должен быть «цвет int». Если у вас есть такой цветовой ресурсR.color.blue
, вам нужно сначала загрузить цвет int:источник
ImageView
экземплярах XML с темой AppCompat или наAppCompatImageView
подклассах.Это сработало для меня
источник
mImageView.setColorFilter(getContext().getResources().getColor(R.color.green_500));
@ Хардик это правильно. Другая ошибка в вашем коде - это когда вы ссылаетесь на свой определенный XML цвет. Вы прошли только идентификатор к
setColorFilter
способу, когда вы должны использовать идентификатор , чтобы найти цвет ресурс и передать ресурс кsetColorFilter
методу. Переписав свой оригинальный код ниже.Если эта строка находится в вашей деятельности:
Иначе, вам нужно указать свою основную деятельность:
Обратите внимание, что это также относится и к другим типам ресурсов, таким как целые числа, bools, измерения и т. Д. За исключением строки, которую вы можете напрямую использовать
getString()
в своей Деятельности без необходимости первого вызоваgetResources()
(не спрашивайте меня, почему) ,В противном случае ваш код выглядит хорошо. (Хотя я не слишком исследовал
setColorFilter
метод ...)источник
После того, как я попробовал все методы, и они не работали для меня.
Я получаю решение с помощью другого PortDuff.MODE.
источник
Начиная с леденец, есть также Оттенок метод BitmapDrawables , который работает с новым классом Palette:
а также
В старых версиях Android вы теперь можете использовать библиотеку DrawableCompat
источник
Лучшая упрощенная функция расширения благодаря ADev
Применение:-
источник
Попробуй это. Он должен работать на всех версиях Android, которые поддерживает библиотека поддержки:
Вы можете использовать любой из вышеперечисленных, чтобы заставить его работать.
Вы можете прочитать о более интересных функциях DrawableCompat в документации здесь .
источник
imageView.getBackground()
drawable, потому чтоimageView.getDrawable()
возвращал ноль.Если ваш цвет имеет прозрачность в шестнадцатеричном формате, используйте код ниже.
Очистить оттенок
источник
img
имеет тип ImageView.Простая и одна строчка
источник
Как первый ответ не работал для меня:
Кажется, это работает только в API 21+, но для меня это не было проблемой. Вы можете использовать ImageViewCompat для решения этой проблемы, хотя.
Я надеюсь, что я помог никому :-)
источник
Начиная с Lollipop, существует метод,
ImageView#setImageTintList()
который вы можете использовать ... преимущество в том, что он требуетColorStateList
а не только один цвет, таким образом, делая оттенок изображения чувствительным к состоянию.На устройствах, предшествующих Lollipop, вы можете получить то же поведение, подкрашивая нарисованный объект, а затем устанавливая его как
ImageView
рисунок для рисования:источник
источник
Для установки оттенка для просмотра изображений программно в Android
У меня есть два метода для Android:
1)
2)
Я надеюсь, что я помог никому :-)
источник
Добавление к ADEV «s ответ (который , по моему мнению , является наиболее правильным), поскольку широкое внедрение Котлин, и его полезных функций расширения:
Я думаю, что эта функция может быть полезна в любом проекте Android!
источник
Я обнаружил, что мы можем использовать селектор цвета для оттенка attr:
activity_main.xml:
section_arrowup_color.xml:
источник
app:srcCompat
вместоandroid:src
и добавьтеvectorDrawables.useSupportLibrary = true
в своюdefaultConfig
часть файла build.gradle. Протестировано для работы на эмуляторе Kitkat.Не используйте
PoterDuff.Mode
, используйтеsetColorFilter()
это работает для всех.источник
Как сказал @milosmns, вы должны использовать
imageView.setColorFilter(getResouces().getColor(R.color.blue),android.graphics.PorterDuff.Mode.MULTIPLY);
Для этого API нужно значение цвета вместо идентификатора ресурса цвета. Это основная причина, по которой ваше утверждение не сработало.
источник
Я опаздываю на вечеринку, но я не видел своего решения выше. Мы также можем установить оттенок цвета
setImageResource()
(мой minSdkVersion равен 24).Итак, во-первых, вам нужно создать селектор и сохранить его в
/drawable
папке активов (я называю этоic_color_white_green_search.xml
)Затем установите его в коде так:
источник
Если вы хотите установить селектор на ваш оттенок:
источник
Решение Kotlin с использованием функции расширения для установки и отмены тонирования:
источник
Не точный ответ, а более простая альтернатива:
Вот фрагмент для этого:
источник
png
. Тогда не изменится ли фон? Также альфа и оттенок очень разные. Оттенок - это как замена цвета, если я не ошибаюсь. Без обид. Просто пытаюсь помочь :)