Android 如何快速实现灰白化换皮肤效果?

简介: ## 原因 清明期间不少客户端都上了灰白皮肤的效果,那我们客户端究竟如何实现黑白皮肤效果呢?本篇文章分享一种方式,让大家在客户端快速的进行黑白化换肤。 ## 效果 彩色效果 ![-w315](https://tva1.sinaimg.cn/large/00831rSTly1gdkd8ga8zrj30hi0v2tb6.jpg) 灰白化后效果 ![-w315](https://tva1.s

原因

清明期间不少客户端都上了灰白皮肤的效果,那我们客户端究竟如何实现黑白皮肤效果呢?本篇文章分享一种方式,让大家在客户端快速的进行黑白化换肤。

效果

彩色效果
-w315
灰白化后效果
-w315

需要基础知识

有些知识不在文章当中阐述,不知道的同学可以自行Google,百度后再看。

如下:kotlin,Activity 的生命周期,viewBinding。

View 如何变灰白化?

1、碰到这种情况,肯定我们要自定义View将他画出来了。然后我们操作Paint画就行了。

2、那我们如何自定义View画呢?有个类叫ColorMatrix,我们将他setSaturation(0f),用获得的对象再给ColorMatrixColorFilter,对Paint当中的colorFilter进行赋值就可以了。最后用这个Paint画就可以了。实现代码如下:

private val paint = Paint().apply {
       ColorMatrix().apply {
            setSaturation(0f)
        }.let {
           colorFilter = ColorMatrixColorFilter(it)
       }
}

Activity 如何变为灰白皮肤的呢?

如上操作后,我们已经知道了自定义View进行灰白化?

那我们怎么对一个Acitivity 进行灰白化呢?

不可能每一个View都去自定义View?

其实一个Activity的产出是有层级的View Three。不知道的同学可以打开Android Studio -> Tools -> Layout Inspector。如下

经过分析,我们写的布局是在ContentFrameLayout下面,因此只要我们替换了ContentFrameLayout,根据View的绘制原理,我们就可以对该布局下的所有View的Paint进行修改了。

那我们如何替换ContentFrameLayout,请回到 Activity 的生命周期,有个方法叫 onCreateView。代码如下,我们把ContentFrameLayout替换成我们的GrayWhiteSkinFrameLayout。

那我们GrayWhiteSkinFrameLayout类里做了什么呢?代码如下

app 如何全部变为灰白皮肤的呢?

实现父类的BaseActivity,子类继承就可以了,具体如下。

Flutter 如何变灰白皮肤的呢?

道理都是一样的,Flutter也是有层级的。我们只需要在最外层的Widget的Build 复写如下代码就好了。

@override
Widget build(BuildContext context) {
  return ColorFiltered(
      colorFilter: ColorFilter.mode(Colors.grey, BlendMode.color),
      child: Scaffold(
        appBar: _appBar,
        body: IndexedStack(
          index: _currIndex,
          children: <Widget>[HomeItemPage(), WidgetPage(), MyPage()],
        ),
        backgroundColor: Theme.of(context).backgroundColor,
        bottomNavigationBar: _buildBottomNavigationBar(context),
      ));
}

demo 地址,欢迎点star:https://github.com/YuriyPikachu/GrayWhiteSkinApp

相关文章
|
Android开发
flutter中实现仿Android端的onResume和onPause方法
flutter中实现仿Android端的onResume和onPause方法
|
Android开发 容器
Android实现面包屑效果,支持Fragment联动
Android实现面包屑效果,支持Fragment联动
|
Android开发
Android实现连线题效果
Android实现连线题效果
|
Android开发
Android实现调用系统相机录像及实现录音
Android实现调用系统相机录像及实现录音
591 0
|
移动开发 JavaScript Android开发
通过howler.js实现在Android下的微信浏览器自动播放音频
通过howler.js实现在Android下的微信浏览器自动播放音频
414 0
通过howler.js实现在Android下的微信浏览器自动播放音频
|
存储 Dart Java
【Flutter】packages思维以及使用Java添加Android平台特定的实现在Flutter框架里的体现和运用
【Flutter】packages思维以及使用Java添加Android平台特定的实现在Flutter框架里的体现和运用
|
缓存 JSON Java
java 实现读取txt文件,反射创建对象,android 手机缓存文件目录
java 实现读取txt文件,反射创建对象,android 手机缓存文件目录
340 1
java 实现读取txt文件,反射创建对象,android 手机缓存文件目录
|
数据库 Android开发
android 多级下拉菜单实现教程 greendao使用
android 多级下拉菜单实现教程 greendao使用
174 0
android 多级下拉菜单实现教程 greendao使用
|
XML 开发工具 Android开发
Android自定义控件(十三)——实现CSDN搜索框文字提示容器
Android自定义控件(十三)——实现CSDN搜索框文字提示容器
267 0
Android自定义控件(十三)——实现CSDN搜索框文字提示容器
|
XML Android开发 数据格式
Android自定义控件(十一)——自定义ViewGroup实现LinearLayout
Android自定义控件(十一)——自定义ViewGroup实现LinearLayout
423 0