相关疑难解决方法(0)

了解使用ColorMatrix和ColorMatrixColorFilter修改Drawable的色相

我正在为应用程序创建UI,我正在尝试使用灰度图标,并允许用户将主题更改为他们选择的颜色.要做到这一点,我试图只应用某种ColorFilter来覆盖drawable顶部的颜色.我尝试过使用PorterDuff.Mode.MULTIPLY,它几乎完全按照我的需要工作,除了白色也覆盖了颜色.我理想的是像Photoshop中的"颜色"混合模式,图形保留其透明度和亮度,只修改图像的颜色.例如:

替代文字替代文字

在做了一些研究后,看起来ColorMatrixColorFilter类可能会做我需要的,但我似乎无法找到指向矩阵如何使用的任何资源.它是一个4x5矩阵,但我需要知道的是我如何设计矩阵.有任何想法吗?

编辑:好的,到目前为止我发现的内容如下:

1 0 0 0 0 //red
0 1 0 0 0 //green
0 0 1 0 0 //blue
0 0 0 1 0 //alpha
Run Code Online (Sandbox Code Playgroud)

此矩阵是单位矩阵(应用时,不做任何更改),数字范围从0到1(浮点数).该矩阵将与每个像素相乘以转换为新颜色.所以这就是我开始变得模糊的地方.所以我认为每个像素都是1 x 4向量,其中包含0.2, 0.5, 0.8, 1将用变换矩阵点缀的argb值(例如).因此,要使图像的红色强度加倍,您可以使用以下矩阵:

2 0 0 0 0 
0 1 0 0 0 
0 0 1 0 0 
0 0 0 1 0 
Run Code Online (Sandbox Code Playgroud)

这会给你一个矢量(颜色)0.4, 0.5, 0.8, 1.从有限的测试,这似乎是这种情况,并且工作正常,但我实际上仍然有同样的问题(即白人获得着色).进一步阅读告诉我,这是因为它正在对RGB值进行转换,而对于色调偏移,应首先将值转换为HSL值.所以我可能会编写一个可以读取图像并转换颜色的类,并用新颜色重绘图像.这会产生StateListDrawables的另一个问题,因为我不知道如何在代码中获取每个代码并修改所有这些问题,以及它将会有多慢.:/

嗯,好吧,所以我想我的另一个问题是矩阵是否可以用于将RGB转换为具有光度信息的另一个颜色空间,例如L a b或HSL?如果是这样,我可以将该转换的矩阵相乘,然后将色调调整为THAT矩阵,然后将该矩阵应用为ColorFilter.

android colormatrix drawable colorfilter

114
推荐指数
7
解决办法
5万
查看次数

标签 统计

android ×1

colorfilter ×1

colormatrix ×1

drawable ×1