Android App Dark Theme(暗黑模式)适配指南

自定义适配

自定义适配的关键在于,避免一切硬编码的颜色值,建立 light 、night 两份 colors,通过定义相同的名字,在不同模式下显示不同的颜色。

1. 确保当前 App 使用的主题继承自 AppCompat 或 MaterialComponents,并将之前默认的 Light 主题修改为 DayNight

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.为 Dark Mode 定义 colors

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

新建完成之后我们的 values 下会有两份 colors 文件,工程结构如下图所示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3. 根据需求对不同模式下相同名字的颜色值做适配

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里推荐使用颜色本身的场景意义来命名,例如上图中的 colorBackground 表示背景颜色,colorOnError 表示在错误状态上,文字的显示颜色,在控件需要颜色的地方,直接通过 @color/colorXXX 来使用

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

自定义适配完全可以达到任何我们想要的效果,相比自动适配,这里我对状态栏、错误颜色以及强调色进行了微调。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 Material Design Components 进行适配

Material Design Components 不仅仅包含了各式各样的组件,还完善了 Material Design 的规范,相比组件来说更重要的是 MD 设计规范。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上图为 Material Design 的官网,在设计一览中,详细制定了各种规范,例如颜色系统该如何设计、阴影的原理和规范、字体的规范、图标该如何选择、交互效果该怎样设计等等。

我个人来说是非常喜欢 Material Design ,之后会计划在这个公众号上面为大家详细的介绍一下Material Design 到底是怎样的,相信很多人都知道 Material Design 但真正读过它的文档,以及认真了解过其设计原理的人,应该寥寥无几。

所以说不是用了 Material Design 的组件就代表自己的 App 遵循了 Material Design 的设计规范,也更别说连这个规范都没看过的人,就一杆子打死说 Material Design 反人类。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 Material Design 官网颜色系统的设计中,专门讲解了关于 Dark theme 该如何设计,之所以叫做 Dark theme,所有的适配都是围绕 theme 来进行的。而上一节的自定义适配中,我们只是简单粗暴的通过 colors 来适配。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Material Design Components 中内置了 12 种不同场景的颜色属性,分别为主强调色、次强调色,背景颜色、表面颜色、错误颜色、以及字体和 icon 的颜色(以 on 开头的)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所以在使用 Material Design Components 进行适配的时候,我们需要定义两种 theme,分别代表 light 和 night,通过分别定义两个主题中相同场景意义的颜色属性来实现暗黑模式的切换。而上一部分自定义适配则是,通过定义一份主题,在同一主题下通过控制 light 、night 两种颜色来实现切换。

相比自定义适配、使用 Material Design Components 适配从设计的角度上更加规范,同时对 theme、attr、style 的不同使用场景也做了更加明确的区分,通过 theme 来规范属性,在控件中不直接操作颜色,而是通过属性来操作颜色,因为属性具有明确的场景意义。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

而 colors 就只需要定义一份,这里推荐使用于颜色本身来命名。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上面就是我针对 light、night 分别定义的两份 theme。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你有没有发现这里我们不需要手动定义 textColor 了,因为前面说了,Material Design Components 内置了 12 种颜色,而我们的这个 TextView 是位于 CardView 上面的,CardView 的默认颜色就是我们 theme 中定义的 colorSurface,TextView 的默认颜色就是 colorOnSurface,所以我们只需要在 theme 中定义属性来指明颜色就可以了,这就是通过属性来操作的好处,当然前提是开发人员必须熟悉 Material Design Components 的颜色规范。

切换主题

目前为止我们已经知道了如何适配暗黑模式,在完成适配之后,我们还需要为用户提供在运行时,切换主题的选项。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通常你可以在设置中为用户提供切换的选项,切换的代码也很简单,通过 delegate.localNightMode 来设置当前的模式。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
有一点需要注意的是,切换逻辑仅在运行时生效,当我们重新启动 App 的时候,会与当前系统设置的模式保持一致,所以当用户执行完切换逻辑后,我们需要对用户的行为进行保存,当下一次重新启动 App 的时候,以恢复用户之前的切换逻辑。

自定义切换逻辑

当我们设置 delegate.localNightMode 的时候,系统会自动重新创建 Activity,如果你不想要重新创建,可以在 manifest 中对应的 Activity 中指定 android:configChanges=“uiMode”,然后重写 onConfigurationChanged() 方法,自己来处理切换逻辑。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
至此所有关于 Android App 的 Dark Mode 适配的内容就介绍到这里,关于更多 Dark Mode 的资料以及本文中 demo 的仓库,关注本公众号【Android|Kotlin】回复【暗黑】可以获取全部内容。
感谢你的观看,如果对你有用,请点个好看,分享转发这篇文章,这将会对我有很大的帮助,谢谢!
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

Android进阶资料

以下的资料是近年来,我和一些朋友面试收集整理了很多大厂的面试真题和资料,还有来自如阿里、小米、爱奇艺等一线大厂的大牛整理的架构进阶资料。希望可以帮助到大家。

Android进阶核心笔记

百万年薪必刷面试题

最全Android进阶学习视频

转存中…(img-a1GN0KuJ-1711907583561)]

百万年薪必刷面试题

[外链图片转存中…(img-6H7Lq2D0-1711907583561)]

最全Android进阶学习视频

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

  • 21
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值