Android 创建ColorFilter的自定义子类?

Android 创建ColorFilter的自定义子类?,android,subclass,extend,colorfilter,Android,Subclass,Extend,Colorfilter,好的,这与我之前关于ColorMatrixColorFilter的问题有些关联,但我觉得这是一个明显不同的问题。我想知道是否有办法——或者更确切地说,如何扩展ColorFilter类来创建我自己的自定义颜色过滤器。对于我需要完成的事情,我需要编写一个自定义过滤器来查询每个像素,将其RGB值转换为HSL或LAB,修改色调,将其转换回RGB,并将该像素设置为新值 我想我可以简单地编写一个类来实现这一点,接受一个可绘制和一定量的色调变换来执行,但是必须为每个可绘制和每个可绘制的状态手动调用它,而Col

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

我想我可以简单地编写一个类来实现这一点,接受一个可绘制和一定量的色调变换来执行,但是必须为每个可绘制和每个可绘制的状态手动调用它,而ColorFilter似乎可以很好地处理这一点。鉴于LightingColorFilter和ColorMatrixColorFilter的存在,它似乎可以被子类化,但到目前为止,我寻找任何类型文档的努力都是徒劳的。我似乎找不到这三个(照明、ColorMatrix、ColorFilter)中任何一个的源代码;我想它们可能是用本地代码完成的

我的问题是:如何正确地将ColorFilter子类化?如果我找不到一个好的答案,如果有人能够找到源代码(我搜索了Android的git)并发布一个链接,那也会很有帮助

谢谢

正如您所说,shows ColorFilter使用本机代码,因此您无法真正将其子类化


除了创建自己想要的类之外,可能没有其他方法了。

您可以使用它来应用自己的颜色过滤技术,但不幸的是,它适用于RGB:

// 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);

但是我不能写我自己的本色滤镜吗?另外,关于为它创建我自己的类,你认为Java会足够快吗,或者这是我应该尝试通过NDK编写的东西吗?是的,你应该在NDK的帮助下创建你的类,这是一个典型的用法,因为它有巨大的性能差异。但我的建议是先用Java编写类,因为它更容易调试,特别是如果您不熟悉NDK的话。。。似乎有一个位图_等离子体样本或多或少正是您需要适应的。如果你在Windows上,你需要安装Cygwin来运行GCC编译器和其他工具,但它看起来相当简单。你最终能够编写自己的颜色过滤器了吗?怎么用?