Потрібно встановити відтінок для перегляду зображення ... Я використовую його наступним чином:
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);
Для векторного малювання
imageView.setColorFilter(ContextCompat.getColor(context, R.color.COLOR_YOUR_COLOR), android.graphics.PorterDuff.Mode.SRC_IN);
UPDATE :
@ADev має більш нове рішення в своїй відповіді тут , але його рішення вимагає більш нової бібліотеки підтримки - 25.4.0 або вище.
android:tint
працює на всіх версіях Android. Може, ти говориш про це drawableTint
?
Більшість відповідей стосуються використання 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);
ImageView
екземплярах xml з темою AppCompat або на AppCompatImageView
підкласах.
Це працювало для мене
mImageView.setColorFilter(ContextCompat.getColor(getContext(), R.color.green_500));
mImageView.setColorFilter(getContext().getResources().getColor(R.color.green_500));
@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
занадто багато не досліджував метод ...)
Починаючи з Lollipop, існує також метод відтінку для BitmapDrawables, який працює з новим класом Palette:
public void setTintList (відтінок ColorStateList)
і
public void setTintMode (PorterDuff.Mode tintMode)
На старих версіях Android тепер ви можете використовувати бібліотеку DravableCompat
Спробуйте це. Він повинен працювати на всіх версіях 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 ви можете прочитати на документах тут .
imageView.getBackground()
щоб отримати тестування, тому що imageView.getDrawable()
повертався недійсним.
Краще спрощена функція розширення завдяки ADev
fun ImageView.setTint(@ColorRes colorRes: Int) {
ImageViewCompat.setImageTintList(this, ColorStateList.valueOf(ContextCompat.getColor(context, colorRes)))
}
Використання: -
imageView.setTint(R.color.tintColor)
Якщо ваш колір має шістнадцяткову прозорість, використовуйте наведений нижче код.
ImageViewCompat.setImageTintMode(imageView, PorterDuff.Mode.SRC_ATOP);
ImageViewCompat.setImageTintList(imageView, ColorStateList.valueOf(Color.parseColor("#80000000")));
Щоб очистити відтінок
ImageViewCompat.setImageTintList(imageView, null);
img
типу ImageView.
Простий і один рядок
imageView.setColorFilter(activity.getResources().getColor(R.color.your_color));
Оскільки перша відповідь не спрацювала для мене:
//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);
Для заданого відтінку для перегляду зображення програмно в Android
У мене є два методи для андроїда:
1)
imgView.setColorFilter(context.getResources().getColor(R.color.blue));
2)
DrawableCompat.setTint(imgView.getDrawable(),
ContextCompat.getColor(context, R.color.blue));
Я сподіваюся, що я комусь допоміг :-)
Додавання до 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-проекті!
Я виявив, що ми можемо використовувати селектор кольорів для 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>
app:srcCompat
замість цього android:src
і додайте vectorDrawables.useSupportLibrary = true
до defaultConfig
частини свого файлу build.gradle. Випробувано, щоб добре працювати на емуляторі Kitkat.
Не використовуйте PoterDuff.Mode
, Використовуйте setColorFilter()
це працює для всіх.
ImageView imageView = (ImageView) listItem.findViewById(R.id.imageView);
imageView.setColorFilter(getContext().getResources().getColor(R.color.msg_read));
Я запізнююсь на партію, але я не бачив свого рішення. Ми можемо встановити колір відтінку за допомогою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)
Якщо ви хочете встановити селектор під свій відтінок:
ImageViewCompat.setImageTintList(iv, getResources().getColorStateList(R.color.app_icon_click_color));
Рішення Котліна за допомогою функції розширення для встановлення та зняття тонування:
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))
}
Не точна відповідь, але простіша альтернатива:
Ось фрагмент для цього:
<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>
png
. Тоді не зміниться фон? Також Альфа і відтінок дуже різні. Відтінок - це як заміна кольору, якщо я не помиляюся. Жодного правопорушення не передбачалося. Просто намагаюся допомогти :)