如何在(可扩展)ListAdapter下设置ImageView的色调?

时间:2017-08-12 17:18:55

标签: java android android-vectordrawable

序言

我现在已经玩了半个小时了,似乎我真的错过了一些重要的事情。

  

注意:我已经尝试过针对这些问题的解决方案

     

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

     

这些解决方案要么重新着色所有 ImageView srcs,要么根本不做任何事情(矢量仍为黑色)。

我的drawable是材料图标目录中的矢量资产:

<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&gt; 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。

所有以上{Grade}的final得到了相同的结果。

其他一些信息

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

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

1 个答案:

答案 0 :(得分:1)

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

PorterDuff.mode

希望这有帮助。