【鸿蒙开发】适配深浅色模式

前言

当前系统存在深浅色两种显示模式,为了给用户更好的使用体验,应用应适配深浅色模式。

效果

深色模式效果

浅色模式效果

实现

首先我们需要设置软件跟随系统的模式来适配

kotlin 复制代码
this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET);

在深色模式的时候,系统会扫描resources下的dark目录下是否有对应的资源文件,用于深色模式。

在resources目录下的base和dark目录下分别设置不同的color资源(key保持一致)

base/element/color.json

json 复制代码
{
  "name": "nav_icon",
  "value": "#ffffff"
}

dark/element/color.json

json 复制代码
{
  "name": "nav_icon",
  "value": "#000000"
}

页面使用

scss 复制代码
Image(this.item.icon)
  .width(24)
  .height(24)
  .fillColor($r('app.color.nav_icon'))

因为name同名,不同模式下会取不同的色值, 这样我们就可以达到适配的目的

扩展

如果我们需要自己控制软件的模式如何去做呢?

准备图标

笔者从阿里巴巴矢量图标库找的svg图标

开发

监听颜色模式的变化

在EntryAbility中新增onConfigurationUpdate事件,将颜色模式加到全局的AppStore中

javascript 复制代码
onCreate() {
    AppStorage.setOrCreate('colorMode', this.context.config.colorMode);
}

onConfigurationUpdate(newConfig: Configuration): void {
  AppStorage.set('colorMode', newConfig.colorMode);
}

页面开发

scss 复制代码
@StorageProp('colorMode') colorMode: ConfigurationConstant.ColorMode =
  ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET;


Image(this.colorMode === ConfigurationConstant.ColorMode.COLOR_MODE_DARK ? $r('app.media.dark') :
$r('app.media.light'))
  .width(20)
  .height(20)
  .onClick(() => {
    this.getUIContext()
      .getHostContext()?.getApplicationContext().setColorMode(this.colorMode ===
    ConfigurationConstant.ColorMode.COLOR_MODE_DARK ? ConfigurationConstant.ColorMode.COLOR_MODE_LIGHT :
    ConfigurationConstant.ColorMode.COLOR_MODE_DARK);
  })
  .position({
    left: 16,
    bottom: 16,
  });

效果

相关推荐
椒哥2 小时前
一天被问几十次"允许",我统计了 517 次,然后写了个插件
前端·javascript·github
风骏时光牛马2 小时前
生成一个AI稳定性治理及疑难问题分析标题,只需要一个标题,不需要其他的任何文本。
前端
莫西干式秃头2 小时前
用 AI + threejs 写了个浏览器里的 3D 动作游戏《武来》:砍怪、放技能、开 SU7
前端·人工智能·three.js
kyriewen2 小时前
我测了 6 种防请求竞态的写法:只有 1 种真能打
前端·javascript·程序员
孟健2 小时前
用 WorkBuddy 做个人名片网页,挂上开源设计技能后效果完全不同了
前端·人工智能·ai编程
IT_陈寒2 小时前
SpringBoot自动配置的坑,这次终于爬出来了
前端·人工智能·后端
LuHang3 小时前
从天地图切换到高德地图:一次真实的底图迁移实战
前端·vue.js·cesium
用户360055579003 小时前
Kestrel_VLLM - 27 · 寄存器常驻与融合发射:两次「少发一次」
前端
前端小万4 小时前
用"道法术器"重构你和 AI 的协作方式
前端·人工智能·程序员
鶴哥只手遮天4 小时前
Angular 22 源码级深度解析-第 06 章 模板指令全解:`ɵɵelementStart`、`ɵɵproperty`、`ɵɵadvance` 与绑定指令
前端·开源·angular.js