Android:使用DrawableCompat的Tint

我正在尝试在Android API级别21之前对图像着色。我已经使用以下方法成功着色了项目:

<android:tint="@color/red"/> 

但是,我似乎无法弄清楚如何通过ImageView上的代码来做到这一点:

 Drawable iconDrawable = this.mContext.getResources().getDrawable(R.drawable.somedrawable); DrawableCompat.setTint(iconDrawable, this.mContext.getResources().getColor(R.color.red)); imageView.setImageDrawable(iconDrawable); 

我试过设置TintMode,但这似乎没有什么不同。 我是否正确使用v4兼容性类DrawableCompat?

色彩交叉平台(如果您不需要ColorStateList)最简单的方法是:

 drawable.mutate().setColorFilter(color, PorterDuff.Mode.SRC_IN); 

在应用filter之前不要忘记修改Drawable。

如果有人需要使用DrawableCompat的着色而不影响其他可绘制的,下面是你怎么做mutate()

 Drawable drawable = getResources().getDrawable(R.drawable.some_drawable); Drawable wrappedDrawable = DrawableCompat.wrap(drawable); wrappedDrawable = wrappedDrawable.mutate(); DrawableCompat.setTint(wrappedDrawable, getResources().getColor(R.color.white)); 

可以简化为:

 Drawable drawable = getResources().getDrawable(R.drawable.some_drawable); drawable = DrawableCompat.wrap(drawable); DrawableCompat.setTint(drawable.mutate(), getResources().getColor(R.color.white)); 

以前的着色不被DrawableCompat支持。 从支持库22.1开始,你可以做到这一点,但是你需要这样做:

 Drawable normalDrawable = getResources().getDrawable(R.drawable.drawable_to_tint); Drawable wrapDrawable = DrawableCompat.wrap(normalDrawable); DrawableCompat.setTint(wrapDrawable, getResources().getColor(R.color.colorPrimaryLight)); 

这里的答案是不适用于前棒棒糖设备(SupportLib 23.4.0),但我已经发布了一个解决scheme,正在API 17和工作: https ://stackoverflow.com/a/37434219/2170109

以下代码已经过testing,正在使用API​​ 17,19,21,22,23和N Preview 3:

  // https://stackoverflow.com/a/30928051/2170109 Drawable drawable = DrawableCompat.wrap(ContextCompat.getDrawable(context, R.drawable.vector)); image.setImageDrawable(drawable); /* * need to use the filter | https://stackoverflow.com/a/30880522/2170109 * (even if compat should use it for pre-API21-devices | https://stackoverflow.com/a/27812472/2170109) */ int color = ContextCompat.getColor(context, R.color.yourcolor); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { DrawableCompat.setTint(drawable, color); } else { drawable.mutate().setColorFilter(color, PorterDuff.Mode.SRC_IN); } 

如果您查看DrawableCompat的源代码,您将会看到,对于任何版本<21, 该方法什么也不做 。

DrawableCompat的想法似乎不是在旧版本崩溃,而是实际上提供的function。

通过支持库22.1,您可以使用DrawableCompat来绘制绘图。

DrawableCompat.wrap(Drawable)和setTint(),setTintList()和setTintMode()将会正常工作:不需要创build和维护单独的drawables只支持多种颜色!

我会在这里分享我的解决scheme,因为这可能会节省一些时间给别人。

我有一个带vector绘图的ImageView作为其源绘制(实际上,它是从 Android支持库23.3支持vector绘制)。 所以,首先我是这样包装的:

mImageView.setImageDrawable(DrawableCompat.wrap(mImageView.getDrawable()));

之后,我试图像这样应用色彩:

 DrawableCompat.setTint( mImageView.getDrawable(), getResources().getColor(R.color.main_color) ); 

没有运气。

我试图在包装的drawable上调用mutate() ,以及在原始的drawable上 – 仍然没有运气。 在mImageView调用invalidate()做了窍门。