如何在 (Expandable)ListAdapter 下设置 ImageView 的色调?

How to set ImageView's tint under (Expandable)ListAdapter?

前言

我已经看了半个小时了,看来我真的错过了一些重要的东西。

Note: I've already tried the solutions for these questions


How to set tint for an image view programmatically in android?
Changing ImageView source

These solutions either recolor ALL ImageView srcs or they don't do anything at all (vector remains black).

我的可绘制对象是来自 material 图标目录的矢量资源:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24.0"
    android:viewportHeight="24.0">

    <path
        android:fillColor="#FF000000"
        android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2z" />
</vector>

我的图片视图:

<ImageView
        android:id="@+id/gradeBullet"
        android:layout_width="25dp"
        android:layout_height="25dp"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:layout_marginStart="25.5dp"
        android:layout_marginTop="25.5dp"
        app:srcCompat="@drawable/importantgrade" />

我想用 *Compat 来做这件事,因为我也想支持更早的 APIs (API>17)。

我的图片视图:ImageView gradeBullet = convertView.findViewById(R.id.gradeBullet);

试一试

MyAmazingAdapter.java - getChildView(...)

gradeBullet.setColorFilter(ContextCompat.getColor(context, gradeObj.colorId), PorterDuff.Mode.MULTIPLY);

结果:什么都不做。

尝试二.

MyAmazingAdapter.java - getChildView(...)

DrawableCompat.setTint(gradeBullet.getDrawable(), ContextCompat.getColor(context, R.color.myColor));

结果:重新着色所有内容。

尝试三

MyAmazingAdapter.java - getChildView(...)

VectorDrawableCompat drawable = (VectorDrawableCompat) gradeBullet.getDrawable();
drawable.setTint(ContextCompat.getColor(context, gradeObj.colorId));
gradeBullet.setImageDrawable(drawable);

结果:呈现奇怪的颜色。 (绝对不是我想要的,更接近原色)

尝试 IV.

上面的所有内容都带有 final 到 gradeBullet,得到相同的结果。

一些其他信息

如果您想了解更多信息,请在评论中提及。

您可以尝试使用 PorterDuff.Mode.SRC_INPorterDuff.Mode.SRC_ATOP 而不是 PorterDuff.Mode.MULTIPLY 的第一种方法。

PorterDuff.mode

希望对您有所帮助。