创建ColorFilter的自定义子类?

时间:2010-12-07 02:58:44

标签: android subclass extend colorfilter

好的,所以这与我之前关于ColorMatrixColorFilter的问题有些相关,但我觉得这是一个截然不同的问题。我想知道是否有办法 - 或者更确切地说,如何扩展ColorFilter类来创建我自己的自定义颜色过滤器。对于我需要完成的任务,我需要编写一个自定义过滤器,它将查询每个像素,将其RGB值转换为HSL或LAB,修改色调,将其转换回RGB,并将该像素设置为新值。

我在想我可以简单地编写一个执行此操作的类,接受Drawable和一定量的色调移位来执行,但必须手动调用每个Drawable,以及每个Drawable的每个状态,而ColorFilter似乎处理得很好。鉴于LightingColorFilter和ColorMatrixColorFilter的存在,它似乎可以被子类化,但到目前为止,我找到任何类型的文档的努力都是徒劳的。我似乎找不到三个中的任何一个的源代码(Lighting,ColorMatrix,ColorFilter);我在想他们可能是用原生代码完成的?

我的问题是:我如何正确地继承ColorFilter?如果我找不到一个好的答案,如果有人能够找到源(我已经搜索过Android的git)并发布了一个链接,那也会有所帮助。

谢谢!

2 个答案:

答案 0 :(得分:1)

不幸的是,您可以使用它来应用自己的滤色器技术:

// The matrix is stored in a single array, and its treated as follows: [ a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t ]
// When applied to a color [r, g, b, a], the resulting color is computed as (after clamping) ;
//   R' = a*R + b*G + c*B + d*A + e;
//   G' = f*R + g*G + h*B + i*A + j;
//   B' = k*R + l*G + m*B + n*A + o;
//   A' = p*R + q*G + r*B + s*A + t;

Paint paint = new Paint();
float[] matrix = {
        1, 1, 1, 1, 1, //red
        0, 0, 0, 0, 0, //green
        0, 0, 0, 0, 0, //blue
        1, 1, 1, 1, 1 //alpha
};

paint.setColorFilter(new ColorMatrixColorFilter(matrix));

无论如何,我都需要在PhotoShop中应用HSL效果(例如colorize),但这并不是100%正确的,但这会带来不错的效果:

 float[] HSL = imageLayer.getColorize();
 PorterDuffColorFilter colorFilter = new PorterDuffColorFilter(ColorUtils.HSLToColor(HSL),PorterDuff.Mode.MULTIPLY);
 paint.setColorFilter(colorFilter);

答案 1 :(得分:0)

正如您所说,source code显示ColorFilter使用本机代码,因此您无法将其子类化。

除了为你想做的事创建自己的课程之外别无他法。