我在一个android应用程序上工作,我有一个可绘制的,我正在从源图像加载。在这个图像上,我想将所有的白色像素转换为不同的颜色,比如蓝色,然后缓存生成的Drawable对象,以便以后使用它。
例如,我有一个20x20的PNG文件,中间有一个白色的圆圈,圆圈之外的一切都是透明的。把白色圆圈变成蓝色并缓存结果的最好方法是什么?如果我想使用源图像来创建几个新的Drawables(比如蓝色、红色、绿色、橙色等),答案会改变吗?
我猜我想在某种程度上使用一个ColorMatrix,但我不确定如何。
我在一个android应用程序上工作,我有一个可绘制的,我正在从源图像加载。在这个图像上,我想将所有的白色像素转换为不同的颜色,比如蓝色,然后缓存生成的Drawable对象,以便以后使用它。
例如,我有一个20x20的PNG文件,中间有一个白色的圆圈,圆圈之外的一切都是透明的。把白色圆圈变成蓝色并缓存结果的最好方法是什么?如果我想使用源图像来创建几个新的Drawables(比如蓝色、红色、绿色、橙色等),答案会改变吗?
我猜我想在某种程度上使用一个ColorMatrix,但我不确定如何。
当前回答
Int color = Color.GRAY;
// or int color = Color.argb(123,255,0,5);
// or int color = 0xaaff000;
在XML /res/values/color.xml中
<?xml version="1.0" encoding="utf-8">
<resources>
<color name="colorRed">#ff0000</color>
</resoures>
Java代码
int color = ContextCompat.getColor(context, R.color.colorRed);
GradientDrawable drawableBg = yourView.getBackground().mutate();
drawableBg.setColor(color);
其他回答
如果你在ImageView中有可绘制的集合,你可以用一行代码完成:
yourImageView.setColorFilter(context.getResources().getColor(R.color.YOUR_COLOR_HERE);
我也使用ImageView图标(在ListView或设置屏幕)。但我认为有更简单的方法。
使用着色来改变所选图标上的颜色叠加。
在xml中,
android:tint="@color/accent"
android:src="@drawable/ic_event"
工作很好,因为它来自AppCompat
我只是遇到了这个问题,并通过替换来解决它:
android:tint="@color/yellow_800"
到以下
app:tint="@color/yellow_800"
太晚了,但以防有人需要:
fun setDrawableColor(drawable: Drawable, color: Int) :Drawable {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
drawable.colorFilter = BlendModeColorFilter(color, BlendMode.SRC_ATOP)
return drawable
} else {
drawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP)
return drawable
}
}
view.getDrawable().mutate().setColorFilter(0xff777777, PorterDuff.Mode.MULTIPLY);
谢谢@sabadow