我试图在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);
在应用过滤器之前,不要忘记改变Drawable。
如果有人需要使用DrawableCompat
的着色而不影响其他drawables,这里是你如何使用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),但我发布了一个适用于API 17及更高版本的解决方法:https://stackoverflow.com/a/37434219/2170109
以下代码已经过测试,正在开发API 17,19,21,22,23和N预览版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 the method does nothing。
DrawableCompat的想法似乎不是在旧版本上崩溃,而是实际提供该功能。
使用支持库22.1,您可以使用DrawableCompat来着色drawable。
DrawableCompat.wrap(Drawable)和setTint(),setTintList()和setTintMode()将起作用:不需要创建和维护单独的drawable只支持多种颜色!
我会在这里分享我的解决方案,因为它可以节省一些时间给某人。
我有一个ImageView
与矢量drawable用作其源drawable(实际上,它是支持矢量Drawable from Android支持库23.3)。所以,首先我把它包起来:
mImageView.setImageDrawable(DrawableCompat.wrap(mImageView.getDrawable()));
之后,我试着像这样应用色调:
DrawableCompat.setTint(
mImageView.getDrawable(),
getResources().getColor(R.color.main_color)
);
没运气。
我试图把mutate()
称为包裹的drawable,以及原始的drawable - 仍然没有运气。 invalidate()
呼吁mImageView
做了伎俩。