当前位置: 首页 > news >正文

HarmonyOS深色模式适配实战——主题切换与WCAG对比度标准

HarmonyOS深色模式适配实战——主题切换与WCAG对比度标准

技术栈:HarmonyOS 5.0 + ArkTS + AppStorage

适用场景:应用主题切换、无障碍适配、华为应用市场审核


前言

深色模式已成为现代应用的标配功能。华为应用市场审核对深色模式有严格要求,所有文字必须清晰可见。本文将介绍如何实现符合WCAG标准的深色模式适配。

一、WCAG对比度标准

WCAG(Web Content Accessibility Guidelines)定义了文字对比度标准:

级别 正常文本 大文本
AA级 ≥ 4.5:1 ≥ 3:1
AAA级 ≥ 7:1 ≥ 4.5:1

二、主题颜色定义

2.1 浅色主题

export const LightTheme: ThemeColors = {pageBg: '#F8F9FA',cardBg: '#FFFFFF',cardBgSecondary: '#F5F5F5',// 文字色 - 符合WCAG标准textPrimary: '#1A1A1A',      // 对比度 16.1:1textSecondary: '#595959',    // 对比度 7.0:1textTertiary: '#737373',     // 对比度 4.6:1divider: '#EEEEEE',border: '#E5E5E5',buttonBg: '#F0F0F0',shadowColor: 'rgba(0, 0, 0, 0.08)',
};

2.2 深色主题

export const DarkTheme: ThemeColors = {pageBg: '#121212',cardBg: '#1E1E1E',cardBgSecondary: '#2A2A2A',// 文字色 - 符合WCAG标准textPrimary: '#FFFFFF',      // 对比度 15.3:1textSecondary: '#CCCCCC',    // 对比度 9.7:1textTertiary: '#999999',     // 对比度 5.1:1divider: '#333333',border: '#404040',buttonBg: '#2A2A2A',shadowColor: 'rgba(0, 0, 0, 0.3)',
};

2.3 主题接口定义

export interface ThemeColors {pageBg: string;cardBg: string;cardBgSecondary: string;textPrimary: string;textSecondary: string;textTertiary: string;divider: string;border: string;buttonBg: string;shadowColor: string;
}

三、主题管理器

export class ThemeManager {private static isDarkMode: boolean = false;private static listeners: Array<(isDark: boolean) => void> = [];static setDarkMode(isDark: boolean): void {ThemeManager.isDarkMode = isDark;ThemeManager.listeners.forEach(listener => listener(isDark));}static getIsDarkMode(): boolean {return ThemeManager.isDarkMode;}static getTheme(): ThemeColors {return ThemeManager.isDarkMode ? DarkTheme : LightTheme;}static addListener(listener: (isDark: boolean) => void): void {ThemeManager.listeners.push(listener);}static removeListener(listener: (isDark: boolean) => void): void {const index = ThemeManager.listeners.indexOf(listener);if (index > -1) ThemeManager.listeners.splice(index, 1);}
}

四、页面中使用主题

4.1 使用AppStorage实现全局状态

@Entry
@Component
struct MainPage {@StorageLink('appDarkMode') isDarkMode: boolean = true;getBgColor(): string { return this.isDarkMode ? '#0D1117' : '#F5F5F5'; }getTextPrimary(): string { return this.isDarkMode ? '#FFFFFF' : '#1A1A1A'; }getTextSecondary(): string { return this.isDarkMode ? 'rgba(255,255,255,0.7)' : 'rgba(0,0,0,0.6)'; }private toggleTheme(): void {this.isDarkMode = !this.isDarkMode;AppStorage.setOrCreate('appDarkMode', this.isDarkMode);PreferencesUtil.putBoolean('app_dark_mode', this.isDarkMode);}build() {Column() {Text('标题').fontSize(24).fontColor(this.getTextPrimary())Text('副标题').fontSize(14).fontColor(this.getTextSecondary())Button('切换主题').onClick(() => this.toggleTheme())}.backgroundColor(this.getBgColor())}
}

4.2 跟随系统主题

import ConfigurationConstant from '@ohos.app.ability.ConfigurationConstant';@Entry
@Component
struct SettingsPage {@StorageProp('currentColorMode') @Watch('onColorModeChange') currentColorMode: number = ConfigurationConstant.ColorMode.COLOR_MODE_LIGHT;@State themeMode: string = 'system'; // 'system' | 'light' | 'dark'onColorModeChange(): void {if (this.themeMode === 'system') {const isDark = this.currentColorMode === ConfigurationConstant.ColorMode.COLOR_MODE_DARK;AppStorage.setOrCreate('appDarkMode', isDark);}}private applyThemeMode(): void {let isDark: boolean;if (this.themeMode === 'system') {isDark = this.currentColorMode === ConfigurationConstant.ColorMode.COLOR_MODE_DARK;} else {isDark = this.themeMode === 'dark';}AppStorage.setOrCreate('appDarkMode', isDark);PreferencesUtil.putString('theme_mode', this.themeMode);}
}

五、对比度检查工具

推荐使用在线工具检查颜色对比度:

  • WebAIM Contrast Checker: https://webaim.org/resources/contrastchecker/
  • Coolors Contrast Checker: https://coolors.co/contrast-checker

六、避坑指南

  1. 华为审核要求:深色模式下所有文字必须清晰可见
  2. @StorageLink vs @StorageProp:前者双向绑定,后者只读
  3. 颜色透明度:使用rgba()时注意透明度对对比度的影响
  4. 图标适配:深色模式下图标也需要适配

总结

本文介绍了HarmonyOS深色模式的完整实现方案,包括符合WCAG标准的颜色定义、主题管理器、页面使用方法等。正确的深色模式适配不仅能通过应用市场审核,还能提升用户体验。

http://www.jsqmd.com/news/109777/

相关文章:

  • 运维---做些什么?架构
  • 2025年年终上海管道疏通推荐:权威榜单解析与专业服务对比评测 - 十大品牌推荐
  • 2025年女孩起名机构联系方式汇总:全国知名机构官方联系通道与专业选择指南 - 十大品牌推荐
  • 76、深入解析AD LDS访问审计与AD FS服务配置
  • 2025年年终上海管道疏通推荐:专业服务排行与用户口碑对比分析 - 十大品牌推荐
  • 6-9 WPS JS宏Map、 set、get、delete、clear()映射的添加、修改、删除
  • 互联网大厂Java面试故事:从Spring全家桶到AI应用场景深度剖析
  • 国产化Excel开发组件Spire.XLS教程:以Python编程方式在Excel中高亮重复值
  • 11、僵尸网络检测:工具与技术全解析
  • 聚焦2025:十大备受推崇的BIP管理平台横向评测,好生意/好会计/易代账/制造云/好业财/协同云/供应链云/人力云BIP服务商推荐排行榜 - 品牌推荐师
  • 2025年12月包头钢结构/钢结构厂房/建筑钢结构/厂家深度分析 - 2025年品牌推荐榜
  • 政府机构适用吗?Kotaemon满足等保三级要求
  • 12、Ourmon:网络监控与异常检测工具全解析
  • 2025上海新房装修指南:十家靠谱装修公司盘点,助你打造理想新家 - 速递信息
  • 2025年装修必看:五大靠谱现浇楼梯公司评选报告,楼板搭建/现浇钢筋混凝土/现浇楼板/现浇楼梯/现浇楼梯公司哪家好选哪家 - 品牌推荐师
  • 一文搞懂RAG架构演进史,以及Kotaemon的创新突破
  • Claude code 多种模型随时切换(最简单的方法)【hepingfly】
  • GPT-5.2并非全面升级,OneEval V1.3 最新“LLM+KB”评测结果出炉
  • 图像重建中的软阈值方法
  • 2025年质量好的变风量阀最新TOP厂家排名 - 行业平台推荐
  • 2025年比较好的工业搅拌器/高粘度物料搅拌器厂家最新实力排行 - 行业平台推荐
  • JavaSE——JRE和JDK
  • 基于微信小程序的在线家庭园艺系统毕业设计源码
  • 腾讯混元这次开源太狠了!把AI视频变成了用户可操控的“开放世界”。(附实操体验)
  • 使用Kotaemon构建企业级FAQ自动化生成器
  • 四川润明启青少年心理行为训练机构联系方式:使用指南与注意事项 - 十大品牌推荐
  • 机床主轴轴承厂家排名权威推荐 替代进口轴承/国产角接触球轴承/车床/铣床/磨床/精密主轴轴承厂家推荐指南 - 小张666
  • Kotaemon能否支持富文本格式的回答输出?
  • 基于微信小程序的在线家庭清洁系统毕设源码
  • 慧荣SM768应用于USB转HDMI 4K+VGA/HDMI 1080p双屏显示方案设计资料