在Android夜间模式原理一文中分析了Android实现夜间模式的原理,而且我们知道无论哪种实现方案都不是很完美。作为程序员我希望既能实夜间模式的平滑切换,又不用写那么多代码。所以我们可以看一下市面上用户量比较大的APP是如何实现夜间模式切换的,以便参考。当然我们看不到源码,只能从效果上去分析。
下面我们一次分析:微信、QQ、微博、头条、百度、QQ浏览器、华为手机浏览器、京东这几个APP。
微信:
微信可以设置深色模式跟随系统,或者手动更改,当手动更改时需要重启APP才能生效,这样的话直接从根源上避免了重新创建Activity会闪的问题,而且不需要在代码中设置资源,但是在某些场景下,这种方式可能不可取,比如阅读类APP,用户看某篇文章看了一半,切换夜间模式后重启了,这是不能接受的。
QQ:
QQ也可以设置夜间模式跟随系统,也可以手动切换,当手动切换夜间模式时有一个loading,然后页面会有渐隐渐显的过程,看起来像重新创建了当前页面。
微博:
微博没有夜间模式,也不支持跟随系统,但是有“护眼模式”,上面第一、三张图是白天模式,第二、四张图是护眼模式,微博没有修改背景和字体颜色,打开GPU过度绘制可以发现,它应该是直接调低了亮度。这也是一种实现方案。
头条:
头条有夜间模式,但是它不支持跟随系统,而且它也没有修改背景和字体颜色,上面第一、三张图是白天模式,第二、四张图是夜间模式,打开GPU过度绘制可以发现,头条的夜间模式是在View上面加了一个半透明的蒙层。
百度:
百度支持夜间模式,但不支持跟随系统,只能手动切换,当切换夜间模式时有一个蒙层动画,但是页面不会闪,所以它有可能没有重新创建页面,而是在代码中更新资源。
QQ浏览器:
QQ浏览器支持夜间模式,但不支持跟随系统,只能手动切换,QQ浏览器切换夜间模式时也有一个蒙层动画,跟百度不同的是它的蒙层是不透明的,所以看不到Activity是否重建了(挺巧妙)。
华为手机浏览器(华为mate 20 pro):
华为手机浏览器默认支持跟随系统,用户用户无法更改是否跟随系统,但是用户可以切换夜间模式,当系统是深色模式时,即使用户切到白天模式,浏览器依然显示为夜间模式的样式(因为时跟随系统的),华为浏览器在进行夜间模式切换时没有做动画,也没有看到页面闪动,所以有可能没有重新创建页面。
京东:
京东的夜间模式支持跟随系统,也可以手动切换,“跟随系统”和“手动切换”是二选一的,手动切换夜间模式时没有做动画但是也没有看到明显的闪动,效果还不错。
还有几个常用的购物类APP没有找到夜间模式的设置,暂时不分析了。
通过上面可以看到切换夜间模式大致有三种实现方式:
1、切换夜间模式之后通过重新创建页面更新资源,比如微信和QQ,但此时要考虑页面状态保存、处理好页面切换动画;
2、切换夜间模式后不重新创建页面,比如百度、华为浏览器、京东,但此时可能要在逻辑代码中重新设置资源,这无疑会增加开发量,所以此时要想办法统一处理更新资源的逻辑,从而减少开发量,也能避免因为遗漏造成夜间模式切换后的显示问题;
3、切换夜间模式后直接修改屏幕亮度或通过增加蒙层改变亮度,这样做的好处是逻辑简单,但效果显然不如上面两种实现方案。
关于夜间模式实现方案的调研至此结束,估计很多项目会采用第二种方式——不重新创建页面,这样的话如何减少开发量就成了一个很重要的问题。