如何为XWalkView设置颜色过滤器?

6

我目前正在开发一个名为 Cornowser 的网页浏览器,它使用 Crosswalk 引擎,但我遇到了一个问题。我想要实现颜色模式,就像 UltimateBrowserProject 中一样。

但是,颜色滤镜无法生效。我尝试设置图层类型,并通过带有颜色滤镜的 Paint 传递它。

以下是源代码:

// Handle color modes

public void drawWithColorMode() {
    Logging.logd("Applying web render color mode...");
    RenderColorMode.ColorMode cm = CornBrowser.getBrowserStorage().getColorMode();
    Paint paint = new Paint();
    final float[] negativeColor = {
            -1.0f, 0, 0, 0, 255,    // Red
            0, -1.0f, 0, 0, 255,    // Green
            0, 0, -1.0f, 0, 255,    // Blue
            0, 0, 0,  1.0f, 0       // Alpha
    };
    final float[] darkColor = {
            1f, 0, 0, 0, -255,
            0, 1f, 0, 0, -255,
            0, 0, 1f, 0, -255,
            0, 0, 0, 1f,    0
    };
    final float[] invertColor = {
            -1f, 0, 0, 0, 0,
            0, -1f, 0, 0, 0,
            0, 0, -1f, 0, 0,
            0, 0, 0, 1f,  0
    };

    Logging.logd("Found color mode: " + cm.mode);

    switch(cm.mode) {
        case RenderColorMode.ColorMode.NORMAL:
            Logging.logd("Applying normal color mode");
            paint.setColorFilter(null);
            break;
        case RenderColorMode.ColorMode.DARK:
            Logging.logd("Applying dark mode");
            paint.setColorFilter(new ColorMatrixColorFilter(darkColor));
            break;
        case RenderColorMode.ColorMode.NEGATIVE:
            Logging.logd("Applying negative mode");
            paint.setColorFilter(new ColorMatrixColorFilter(negativeColor));
            break;
        case RenderColorMode.ColorMode.INVERT:
            Logging.logd("Applying inverted mode");
            paint.setColorFilter(new ColorMatrixColorFilter(invertColor));
            break;
        case RenderColorMode.ColorMode.GREYSCALE:
            Logging.logd("Applying greyscale");
            ColorMatrix m = new ColorMatrix();
            m.setSaturation(0);
            paint.setColorFilter(new ColorMatrixColorFilter(m));
            break;
        default:
            Logging.logd("Warning: Unknown color mode " + cm.mode + ".");
            break;
    }

    Logging.logd("Setting layer type...");
    setLayerType(LAYER_TYPE_HARDWARE, paint);
}

我也尝试了通过覆盖draw(canvas),但结果是一样的。

有人知道如何为XWalkView设置颜色过滤器吗?

提前感谢!

更新:

似乎SurfaceView不支持颜色过滤器。无论如何如何处理?

更新2: 看起来这个问题没有得到太多关注...我编辑了我的源代码,应该可以工作,但它不工作,请检查它,logcat给我以下输出:

D/Cornowser: Applying web render color mode...
D/Cornowser: Found color mode: 2
D/Cornowser: Applying negative mode
D/Cornowser: Setting layer type...

最终更新: 我最终使用JavaScript解决了它。 如果你想知道我是如何解决的,请看这里

1个回答

0

重写 draw(Canvas) 方法

编写上述源代码

在 draw() 方法的结尾调用 invalidate()。


我不明白为什么你想在draw()的结尾调用invalidate()。 - xdevs23

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接