Как настроить оттенок для просмотра изображений программно в Android?
Нужно установить оттенок для просмотра изображений... Я использую его следующим образом:
imageView.setColorFilter(R.color.blue,android.graphics.PorterDuff.Mode.MULTIPLY);
Но это не меняет...
30 ответов
Вы можете легко изменить оттенок в коде с помощью:
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);
ОБНОВЛЕНИЕ: @ADev имеет более новое решение в своем ответе здесь, но, кажется, он забыл упомянуть, что его решение требует более новой библиотеки поддержки 25.4.0 или выше.
Большинство ответов относятся к использованию setColorFilter
это не то, что изначально было задано.
Пользователь @Tad имеет свой ответ в правильном направлении, но он работает только на API 21+.
Чтобы установить оттенок на всех версиях Android, используйте ImageViewCompat
:
ImageViewCompat.setImageTintList(imageView, ColorStateList.valueOf(yourTint));
Обратите внимание, что yourTint
в этом случае должен быть "цвет int". Если у вас есть цветовой ресурс, как R.color.blue
сначала вам нужно загрузить цвет int:
ContextCompat.getColor(context, R.color.blue);
Это сработало для меня
mImageView.setColorFilter(ContextCompat.getColor(getContext(), R.color.green_500));
@ Хардик это правильно. Другая ошибка в вашем коде - это когда вы ссылаетесь на свой 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);
Обратите внимание, что это также относится и к другим типам ресурсов, таким как целые числа, bools, измерения и т. Д. За исключением строки, для которой вы можете напрямую использовать getString()
в вашей деятельности без необходимости сначала позвонить getResources()
(не спрашивайте меня, почему).
В противном случае ваш код выглядит хорошо. (Хотя я не исследовал setColorFilter
метод слишком много...)
Лучшая упрощенная функция расширения благодаря ADev
fun ImageView.setTint(@ColorRes colorRes: Int) {
ImageViewCompat.setImageTintList(this, ColorStateList.valueOf(ContextCompat.getColor(context, colorRes)))
}
Использование:-
imageView.setTint(R.color.tintColor)
Если ваш цвет имеет прозрачность в шестнадцатеричном формате, используйте приведенный ниже код.
ImageViewCompat.setImageTintMode(img,PorterDuff.Mode.SRC_ATOP);
ImageViewCompat.setImageTintList(img,ColorStateList.valueOf(Color.parseColor("#80000000")));
Очистить оттенок
ImageViewCompat.setImageTintList(img, null);
После того, как я попробовал все методы, и они не работали для меня.
Я получаю решение с помощью другого PortDuff.MODE.
imgEstadoBillete.setColorFilter(context.getResources().getColor(R.color.green),PorterDuff.Mode.SRC_IN);
Начиная с Lollipop, для BitmapDrawables также существует метод tint, который работает с новым классом Palette:
public void setTintList (ColorStateList tint)
а также
public void setTintMode (PorterDuff.Mode tintMode)
В старых версиях Android вы теперь можете использовать библиотеку DrawableCompat
Простая и одна строчка
imageView.setColorFilter(activity.getResources().getColor(R.color.your_color));
Попробуй это. Он должен работать на всех версиях 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 в документации здесь.
Решение 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))
}
Я обнаружил, что мы можем использовать селектор цвета для оттенка 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>
Для установки оттенка для просмотра изображений программно в Android
У меня есть два метода для Android:
1)
imgView.setColorFilter(context.getResources().getColor(R.color.blue));
2)
DrawableCompat.setTint(imgView.getDrawable(),
ContextCompat.getColor(context, R.color.blue));
Я надеюсь, что я помог никому:-)
Добавление к 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!
Функция расширения в kotlin для установки и отключения оттенка.
fun ImageView.setTint(@ColorRes color: Int?) {
if (color == null) {
ImageViewCompat.setImageTintList(this, null)
} else {
ImageViewCompat.setImageTintList(this, ColorStateList.valueOf(ContextCompat.getColor(context, color)))
}}
Применение:
yourImageView.setTint(R.color.white)
для установки и для удаления только:
yourImageView.setTint(null)
Как первый ответ не работал для меня:
//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 для решения этой проблемы, хотя.
Я надеюсь, что я помог никому:-)
Начиная с 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);
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);
В java я использую
imageView.setImageTintList(ColorStateList.valueOf(ContextCompat.getColor(context, R.color.red)));
Как сказал @milosmns, вы должны использовать
imageView.setColorFilter(getResouces().getColor(R.color.blue),android.graphics.PorterDuff.Mode.MULTIPLY);
Для этого API нужно значение цвета вместо идентификатора ресурса цвета. Это основная причина, по которой ваше утверждение не сработало.
Не используйте режим PowerDuff, используйте setColorFilter, он работает для всех.
ImageView imageView = (ImageView) listItem.findViewById(R.id.imageView);
imageView.setColorFilter(getContext().getResources().getColor(R.color.msg_read));
Если вы хотите установить селектор на ваш оттенок:
ImageViewCompat.setImageTintList(iv, getResources().getColorStateList(R.color.app_icon_click_color));
Я опаздываю на вечеринку, но я не видел своего решения выше. Мы можем установить оттенок цвета с помощью 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)
Я сделал ниже:
view.drawable.setTint(ContextCompat.getColor(requireContext(),R.color.color_05F73F))
Для меня этот код работает. Я использую его с картами и изображениями, но я уменьшил его, чтобы он работал в любом виде, чтобы изменить их оттенки цветов.cardBookmark - это моя cardView.
var cardDrawable: Drawable = binding.cardBookmark.background
cardDrawable = DrawableCompat.wrap(cardDrawable)
DrawableCompat.setTint(cardDrawable, resources.getColor(R.color.shuffleColor))
binding.cardBookmark.background = cardDrawable
Отказ от ответственности: это не ответ на этот пост. Но это ответ на этот вопрос, т.е. как сбросить цвет/оттенок изображения или изображения. Извините, что разместил это здесь, поскольку этот вопрос не принимает ответы и ссылается на этот пост для ответов. Итак, добавив его сюда, чтобы кто-то, ищущий решение, мог посмотреть на это.
Как упоминалось user10977224 в комментарии к этому ответу. Мы можем сбросить цвет, используя
setImageTintList()
и прохождение
null
как список оттенков. Это сработало волшебным образом для меня.
ImageViewCompat.setImageTintList(imageView, null)
если вы меняете оттенок при изменении фокуса, попробуйте это, пожалуйста
DrawableCompat.setTint(imgView.getDrawable(),
ContextCompat.getColor(context, R.color.blue));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
menuIcon.setImageTintList(ColorStateList.valueOf(ContextCompat.getColor(this, R.color.primary)));
}
Я использую этот фрагмент кода, чтобы изменить оттенок моего значка меню, надеюсь, это поможет.
После того, как я перепробовал все методы, и они не работали для меня.
Я получаю решение специально в случае, если вы меняете цвет с помощью любой библиотеки colorPicker, которая возвращает целочисленное значение selectedColor.
widgetIcon
мой ImageView иselectedColor
это цвет из colorPicker
var imageDrawable: Drawable = widgetIcon.background
imageDrawable = DrawableCompat.wrap(imageDrawable)
DrawableCompat.setTint(imageDrawable, selectedColor)
widgetIcon.background = imageDrawable
Не точный ответ, а более простая альтернатива:
- Поместите другой вид сверху изображения
- Измените альфа- значение представления так, как вы хотите (программно), чтобы получить желаемый эффект.
Вот фрагмент для этого:
<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>