Нужно установить оттенок для представления изображения... Я использую его следующим образом:
imageView.setColorFilter(R.color.blue,android.graphics.PorterDuff.Mode.MULTIPLY);
Но это не меняется...
Нужно установить оттенок для представления изображения... Я использую его следующим образом:
imageView.setColorFilter(R.color.blue,android.graphics.PorterDuff.Mode.MULTIPLY);
Но это не меняется...
Вы можете легко изменить оттенок в коде с помощью:
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 или выше.
Большинство ответов относятся к использованию 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);
Это сработало для меня
mImageView.setColorFilter(ContextCompat.getColor(getContext(), R.color.green_500));
@Хардик прав. Другая ошибка в вашем коде - это когда вы ссылаетесь на свой цвет, определенный 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
слишком много...)
После того, как я пробовал все методы, и они не работали для меня.
Я получаю решение с помощью другого PortDuff.MODE.
imgEstadoBillete.setColorFilter(context.getResources().getColor(R.color.green),PorterDuff.Mode.SRC_IN);
Начиная с леденец, есть также Оттенок метод BitmapDrawables, который работает с новым классом Palette:
public void setTintList (оттенок ColorStateList)
а также
public void setTintMode (PorterDuff.Mode tintMode)
В старых версиях Android теперь вы можете использовать библиотеку DrawableCompat
Попробуй это. Он должен работать на всех версиях 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 на документы, здесь.
Простая и одна строка
imageView.setColorFilter(activity.getResources().getColor(R.color.your_color));
Начиная с 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);
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);
Поскольку первый ответ не сработал у меня:
//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.
Надеюсь, я помог кому-нибудь: -)
Если ваш цвет имеет прозрачность шестнадцатеричного цвета, используйте приведенный ниже код.
ImageViewCompat.setImageTintMode(img,PorterDuff.Mode.SRC_ATOP);
ImageViewCompat.setImageTintList(img,ColorStateList.valueOf(Color.parseColor("#80000000")));
Чтобы очистить оттенок
ImageViewCompat.setImageTintList(img, null);
Я обнаружил, что мы можем использовать селектор цвета для оттенка 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>
Не используйте PoterDuff.Mode
, используйте setColorFilter()
он работает для всех.
ImageView imageView = (ImageView) listItem.findViewById(R.id.imageView);
imageView.setColorFilter(getContext().getResources().getColor(R.color.msg_read));
Как сказал @milosmns, вы должны использовать
imageView.setColorFilter(getResouces().getColor(R.color.blue),android.graphics.PorterDuff.Mode.MULTIPLY);
Для этого API требуется значение цвета вместо идентификатора ресурса цвета. Это основная причина, почему ваш оператор не работает.
Я опаздываю на вечеринку, но я не видел своего решения выше. Мы также можем установить оттенок цвета с помощью 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)
Добавление к 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!
Для установки оттенка для просмотра изображений программно в Android
У меня есть два метода для Android:
1)
imgView.setColorFilter(context.getResources().getColor(R.color.blue));
2)
DrawableCompat.setTint(imgView.getDrawable(),
ContextCompat.getColor(context, R.color.blue));
Я надеюсь, что я помог никому :-)
Лучшая упрощенная функция расширения благодаря ADev
fun ImageView.setTint(@ColorRes colorRes: Int) {
ImageViewCompat.setImageTintList(this, ColorStateList.valueOf(ContextCompat.getColor(context, colorRes)))
}
Использование:-
imageView.setTint(R.color.tintColor)
Если вы хотите установить селектор на ваш оттенок:
ImageViewCompat.setImageTintList(iv, getResources().getColorStateList(R.color.app_icon_click_color));
Просто добавьте, если вы хотите удалить существующий оттенок, вы можете установить его в прозрачный цвет:
mSignInButton.setColorFilter(Color.TRANSPARENT);
Неточный ответ, но более простая альтернатива:
Вот фрагмент для этого:
<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>