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

标签 java android android-vectordrawable

序言

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

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

How to change color of vector drawable path on button click
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 资源:

<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 :

<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 来实现此目的,因为我还想支持早期的 API (API>17)。

我的ImageView:ImageView GradeBullet = ConvertView.findViewById(R.id.gradeBullet);

尝试我。

MyAmazingAdapter.java - getChildView(...)

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

结果:什么也不做。

尝试 II。

MyAmazingAdapter.java - getChildView(...)

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

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

尝试 III。

MyAmazingAdapter.java - getChildView(...)

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

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

尝试 IV。

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

一些其他信息

  • gradeObj.colorId 对于每个 subview 都是不同的。
  • 使用形状和 setColor 而不是 SVG 不是我想要的。
  • 目前仅使用 API lvl 26 进行测试
  • MyAmazingAdapter.java 扩展 BaseExpandableListAdapter

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

最佳答案

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

PorterDuff.mode

希望这有帮助。

关于java - 如何在(Expandable)ListAdapter下设置ImageView的色调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45652954/

相关文章:

java - 改进添加 BigIntegers 的方法

java - 如何修复 java.lang.UnsupportedClassVersionError : Unsupported major. 次要版本

android - 如何在不使用 eclipse 的情况下调试/单步执行 android 应用程序

android - "Nothing to show"当我尝试在 Android Studio 中插入一个新的 Vector Asset

android - 除了带有 srcCompat 的 ImageView 之外,如何使用带有 View 的矢量可绘制对象?

IntelliJ IDEA 中的 Java 和 Maven : How to properly import a dependency

android - 为什么我需要使用buttonStyle而不是android :buttonStyle with API level 16?

java - Arraylist 索引越界异常

android - 单击时以编程方式更改矢量 Assets 颜色

java - 如何使用 MD5 哈希值比较电子邮件