Compose实现黑白化?很简单!

今天是南京大屠杀死难者国家公祭日,在这里为死去的同胞进行默哀。

本篇文章咱们纯谈技术。

写作缘由

由于今天这个特殊的日子,好多应用都以黑白化的形式为死去的同胞进行哀悼,比如某东和某宝:

image.png image.png

我记得去年的时候掀起一波黑白化 APP 的高潮,泓洋大神写了一篇探索 Android 原生实现黑白化的文章,然后之后又有 Flutter 版本出现,继而又有一些人实现出来一些别的方案。但今天咱们不考虑原生 Android 是如何实现的,想看的话可以去搜泓洋大神的文章。今天咱们主要考虑使用 Compose 如何实现黑白化。

开始干活

其实之前泓洋大神文章中最后的实现方案就是替换根布局的 FrameLayout,然后设置饱和度为 0 就可以了。Flutter 中的实现更为简单一些,因为 Flutter 官方提供了一个 Widget :ColorFiltered,可以直接实现应用的黑白化。

接下来重点来了,Compose 中并没有提供类似 Flutter 中的 ColorFiltered,那应该怎么搞呢?

其实使用泓洋大神之前的方案也是没有问题的,但 Compose 应该有更加简单的方式实现,来看下吧:

Surface(color = MaterialTheme.colors.background,) {
    // 正常布局
    NavGraph()
    // 黑白化
    Canvas(modifier = Modifier.fillMaxSize()){
        drawRect(
            color = Color.White,
            blendMode = BlendMode.Saturation
        )
    }
}
复制代码

通过上面代码可以看到之前的一堆代码现在只需要三行,如果去除缩进的话只需要一行。。

原理是一样的,也是通过设置 Saturation,来看下实现效果吧:

image.png image.png

效果还好,在预期范围内,大家如果有更好的方法可以在评论区告诉我,感激不尽。

上面两个应用都是开源的,下面是开源地址

玩天气 Github:https://github.com/zhujiang521/PlayWeather

玩安卓 Github:https://github.com/zhujiang521/PlayAndroid

打完收工

大家可以购买我的新书《Jetpack Compose:Android全新UI编程》进行阅读,里面有完整的 Compose 框架供大家学习。

京东购买地址

当当购买地址

呸呸呸,太不要脸了,又在推荐自己的新书。。。

如果对你有帮助的话,别忘记点个 Star,感激不尽。

其实还有一些细节的东西我没有说到,大家如果有疑问的话可以在评论区提出来。

先写到这里吧,再会!

Guess you like

Origin juejin.im/post/7041094044948103199