Android 深色主题与设计令牌

举报
shenlan9755 发表于 2026/09/20 09:12:57 2026/09/20
【摘要】 Android 深色主题与设计令牌深色主题不是把所有颜色反转。文字层级、品牌色、分割线、图片和系统栏都需要在不同外观下保持对比度与一致语义。若业务布局直接写入大量颜色值,切换主题会变成逐页修补。更可维护的方式是先建立语义化设计令牌,再由不同主题提供具体值。 一、颜色名称表达语义相比 gray_333,text_primary、surface_page 和 status_warning 更能...

Android 深色主题与设计令牌

深色主题不是把所有颜色反转。文字层级、品牌色、分割线、图片和系统栏都需要在不同外观下保持对比度与一致语义。若业务布局直接写入大量颜色值,切换主题会变成逐页修补。更可维护的方式是先建立语义化设计令牌,再由不同主题提供具体值。

一、颜色名称表达语义

相比 gray_333,text_primary、surface_page 和 status_warning 更能表达用途。具体颜色变化时,业务布局无需修改。

<resources>
    <color name="surface_page">#FFFFFF</color>
    <color name="surface_card">#F5F6F8</color>
    <color name="text_primary">#1A1A1A</color>
    <color name="text_secondary">#666666</color>
</resources>

夜间资源目录提供同名值:

<resources>
    <color name="surface_page">#121212</color>
    <color name="surface_card">#1C1C1E</color>
    <color name="text_primary">#F2F2F2</color>
    <color name="text_secondary">#B3B3B3</color>
</resources>

具体色值应来自项目设计规范,示例只说明资源组织方式。

二、优先通过主题属性引用

公共组件可以引用主题属性,让不同业务主题覆盖实现:

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="?attr/colorTextPrimary"
    android:textSize="16dp" />

文本宽高使用 wrap_content,字号使用 dp,并通过父布局约束可用空间,符合项目适配规则。

主题属性应集中定义,不在各模块重复声明语义相近的名称。

三、处理状态颜色

按钮、输入框和列表项通常有按下、禁用、选中等状态。状态选择器应同时考虑浅色与深色主题,不能只替换默认颜色。

禁用状态不应仅通过降低透明度处理,如果叠加在不同背景上会得到不可控结果。优先使用设计规范中明确的禁用前景与背景令牌。

四、避免运行时遍历修改颜色

主题切换后遍历视图树并手动替换颜色,容易遗漏弹窗、自定义控件和后创建视图。资源与主题机制能够在创建或重建界面时统一解析颜色,更适合大规模页面。

只有画布绘制、动态图表等无法直接使用普通资源的场景,才需要监听主题并更新画笔。

fun updateColors() {
    linePaint.color = resolveThemeColor(R.attr.colorChartLine)
    textPaint.color = resolveThemeColor(R.attr.colorTextPrimary)
    invalidate()
}

五、图片和图标也要适配

纯色图标优先使用可着色资源,从主题获取颜色。包含阴影、渐变和照片的图片不能简单着色,需要由设计提供适合深色背景的版本或容器处理方案。

透明图片在深色背景上可能出现白边,启动图和空状态插画尤其需要真机检查。

六、同步系统栏与弹窗

状态栏、导航栏图标的明暗应与背景匹配。应用内弹窗、底部面板和浮层也必须继承正确主题,避免深色页面弹出浅色且文字不可读的窗口。

相关系统 API 存在版本差异,应使用项目现有兼容控制器,不直接调用超出最低兼容版本的能力。

七、响应主题变化

跟随系统模式时,配置变化可能触发页面重建。页面状态应由 ViewModel 和保存状态恢复,不要为了避免重建而让每个控件手动处理所有资源。

视频播放、编辑草稿等确实需要特殊保持的页面,可以沿用项目配置变化方案,但仍要确保资源重新解析。

八、WebView 与混合页面

混合页面的原生容器和 H5 内容需要约定主题参数与切换时机。原生只传递语义模式,不应向页面发送大量具体色值。页面内部使用自身设计令牌完成渲染。

主题更新消息要与页面生命周期对齐,避免页面尚未准备时丢失首次状态。

九、检查对比度与层级

深色背景下,纯白大面积文字可能过于刺眼,次级文字又容易对比不足。重点检查:

  • 正文、辅助文字和占位文字。
  • 品牌色文字与按钮。
  • 涨跌、警告和成功状态。
  • 分割线与卡片边界。
  • 禁用和按压状态。
  • 截图、图表和第三方页面。

颜色不能是唯一的信息表达方式,状态还应有文本、图标或形状差异。

十、建立主题回归测试

可为核心组件建立浅色和深色视觉基准,并在小屏、长文本和不同业务状态下检查。自动截图能发现大面积遗漏,人工验证则关注对比度、图片质量和系统窗口一致性。

总结

深色主题的关键是语义化颜色体系。业务布局引用主题令牌,不直接绑定具体色值,状态、图标、系统栏和混合页面都使用同一语义。通过资源机制响应外观变化,再用完整状态矩阵验证,主题维护才能从逐页修补变成系统能力。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。