鸿蒙开发:适配系统深浅色模式

简介: 无论是Android还是iOS,在系统设置中,都有着深色和浅色两种外观模式,同样,鸿蒙系统中也存在这样的外观切换,如何让自己的应用,跟随着系统的模式进行动态切换呢?目前系统给我们提供了两种方式可以实现,一种是资源形式,一种是动态的代码形式。

前言


代码运行环境:全部基于HarmonyOs NEXT

DevEco Studio:Build Version: 5.0.3.900

API:12

modelVersion5.0.0


无论是Android还是iOS,在系统设置中,都有着深色和浅色两种外观模式,同样,鸿蒙系统中也存在这样的外观切换,如何让自己的应用,跟随着系统的模式进行动态切换呢?目前系统给我们提供了两种方式可以实现,一种是资源形式,一种是动态的代码形式。


资源形式实现


所谓资源形式,就是深色和浅色各有一套样式,比如颜色,浅色有一个,深色也有一个,当系统模式切换之后,便主动寻找对应模式下的颜色,同样,放到其它资源上也是类似。

首先,在resources资源下,定义出浅色模式对应的深色资源,命名为dark,把我们对应的颜色,或者图片,一一放到对应的模式下。




简单案例


一个很简单的页面,颜色和背景均选取资源下定义好的。


@Entry
@Component
struct Index {
  build() {
    Column() {
      Text("鸿蒙开发:跟着系统深浅色适配")
        .fontSize(18)
        .fontColor($r("app.color.title_color"))
        .margin({ top: 10 })
      Text("无论是Android还是iOS,在系统设置中,都有着深色和浅色两种外观模式,同样,鸿蒙系统中也存在这样的外观切换,如何让自己的应用,跟随着系统的模式进行动态切换呢?目前系统给我们提供了两种方式可以实现,一种是资源形式,一种是动态的代码形式。")
        .fontSize(16)
        .fontColor($r("app.color.desc_color"))
        .margin({ top: 20 })
    }.backgroundColor($r("app.color.start_window_background"))
    .width("100%")
    .height("100%")
    .padding({ left: 20, right: 20 })
  }
}


浅色模式


{
  "color": [
    {
      "name": "start_window_background",
      "value": "#FFFFFF"
    },
    {
      "name": "title_color",
      "value": "#222222"
    },
    {
      "name": "desc_color",
      "value": "#666666"
    }
  ]
}


深色模式


{
  "color": [
    {
      "name": "start_window_background",
      "value": "#000000"
    },
    {
      "name": "title_color",
      "value": "#ffffff"
    },
    {
      "name": "desc_color",
      "value": "#e8e8e8"
    }
  ]
}


实际效果


浅色模式



深色模式



图片资源适配


图片和颜色是类似的,浅色和深色放在对应的模式下即可。


Image($r('app.media.test'))
  .width(50)


代码形式


除了资源的形式之外,我们还可以通过代码的方式进行实现,代码的实现方式,需要我们监听系统的模式切换,然后,根据当前的模式,设置不同的资源样式即可。

监听系统的深色和浅色模式切换:


首先,针对当前的模式,先进行保存,这里使用的是AppStorage,保存当前模式,主要是初始化进来需要针对性的设置。


onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
    AppStorage.setOrCreate('colorMode', this.context.config.colorMode)
  }


除了默认的之外,当系统的模式发生变化的时候,也需要进行保存,我们可以在在 AbilityStage 的 onConfigurationUpdate() 方法中获取最新的颜色模式同步更新到AppStorage中。


onConfigurationUpdate(newConfig: Configuration): void {
    AppStorage.setOrCreate('colorMode', newConfig.colorMode)
    hilog.info(0x0000, 'testTag', 'the newConfig.colorMode');
  }


还是上边的那个案例,我们在UI页面进行动态的监听模式改变。


@Entry
@Component
struct Index {
  @State titleColor?: ResourceColor = undefined
  @State descColor?: ResourceColor = undefined
  @State bgColor?: ResourceColor = undefined
  @StorageProp('colorMode') @Watch('onColorModeChange') currentMode: number =
    ConfigurationConstant.ColorMode.COLOR_MODE_LIGHT;
  aboutToAppear(): void {
    this.onColorModeChange()
  }
  onColorModeChange(): void {
    if (this.currentMode == ConfigurationConstant.ColorMode.COLOR_MODE_LIGHT) {
      //浅色模式
      this.bgColor = "#ffffff"
      this.titleColor = "#222222"
      this.descColor = "#666666"
    } else {
      //深色模式
      this.bgColor = "#000000"
      this.titleColor = "#ffffff"
      this.descColor = "#e8e8e8"
    }
  }
  build() {
    Column() {
      Text("鸿蒙开发:跟着系统深浅色适配")
        .fontSize(18)
        .fontColor(this.titleColor)
        .margin({ top: 10 })
      Text("无论是Android还是iOS,在系统设置中,都有着深色和浅色两种外观模式,同样,鸿蒙系统中也存在这样的外观切换,如何让自己的应用,跟随着系统的模式进行动态切换呢?目前系统给我们提供了两种方式可以实现,一种是资源形式,一种是动态的代码形式。")
        .fontSize(16)
        .fontColor(this.descColor)
        .margin({ top: 20 })
    }
    .backgroundColor(this.bgColor)
    .width("100%")
    .height("100%")
    .padding({ left: 20, right: 20 })
    .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM])
  }
}


可以发现,效果和上面的资源形式是一样的。


相关总结


无论是资源模式,还是代码模式,都可以实现跟随系统模式的改变而改变,如果,你不想跟着系统改变,有两种方式,第一种方式是正常开发就行,默认就是浅色模式,但是,如果你想默认深色模式,那么就需要进行代码设置了,设置之后,就不会跟着系统的改变而改变了。


this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_DARK)
相关文章
|
3月前
|
安全 JavaScript API
鸿蒙开发核心要素
鸿蒙开发核心要素
|
21天前
|
存储 缓存 5G
鸿蒙 HarmonyOS NEXT端云一体化开发-云存储篇
本文介绍用户登录后获取昵称、头像的方法,包括通过云端API和AppStorage两种方式,并实现上传头像至云存储及更新用户信息。同时解决图片缓存问题,添加上传进度提示,支持自动登录判断,提升用户体验。
94 0
|
21天前
|
存储 负载均衡 数据库
鸿蒙 HarmonyOS NEXT端云一体化开发-云函数篇
本文介绍基于华为AGC的端云一体化开发流程,涵盖项目创建、云函数开通、应用配置及DevEco集成。重点讲解云函数的编写、部署、调用与传参,并涉及环境变量设置、负载均衡、重试机制与熔断策略等高阶特性,助力开发者高效构建稳定云端服务。
198 0
鸿蒙 HarmonyOS NEXT端云一体化开发-云函数篇
|
21天前
|
存储 JSON 数据建模
鸿蒙 HarmonyOS NEXT端云一体化开发-云数据库篇
云数据库采用存储区、对象类型、对象三级结构,支持灵活的数据建模与权限管理,可通过AGC平台或本地项目初始化,实现数据的增删改查及端侧高效调用。
62 0
|
21天前
|
存储 开发者 容器
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
本文介绍了ArkTS语言中的Class类、泛型、接口、模块化、自定义组件及状态管理等核心概念,并结合代码示例讲解了对象属性、构造方法、继承、静态成员、访问修饰符等内容,同时涵盖了路由管理、生命周期和Stage模型等应用开发关键知识点。
156 0
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
|
21天前
鸿蒙 HarmonyOS NEXT星河版APP应用开发-阶段三
本文介绍了UI开发中的样式复用与组件构建技术,涵盖@Extend、@Styles和@Builder的使用方法,并通过Swiper轮播、Scroll滚动、Tabs导航等常用组件实现典型界面效果,结合生肖抽卡、小米轮播、回顶按钮等案例,展示实际应用技巧。
79 0
|
21天前
鸿蒙 HarmonyOS NEXT星河版APP应用开发-阶段二
本文介绍鸿蒙应用界面开发中的弹性布局(Flex)、绝对定位、层叠布局及ArkTS语法进阶,涵盖字符串拼接、类型转换、数组操作、条件与循环语句,并结合B站视频卡、支付宝首页等案例,深入讲解点击事件、状态管理与界面交互功能。
90 0
鸿蒙 HarmonyOS NEXT星河版APP应用开发-阶段二
|
10天前
|
传感器 监控 安全
HarmonyOS NEXT 5.0 的星闪(NearLink)开发应用案例
V哥分享HarmonyOS NEXT 5.0星闪开发实战,涵盖智能车钥匙无感解锁与工业传感器监控。低延迟、高可靠,代码完整,速来学习!
112 0
|
2月前
|
移动开发 网络协议 小程序
鸿蒙NEXT即时通讯/IM系统RinbowTalk v2.4版发布,基于MobileIMSDK框架、ArkTS编写
RainbowTalk是一套基于开源即时通讯讯IM框架 MobileIMSDK 的产品级鸿蒙NEXT端IM系统。纯ArkTS编写、全新开发,没有套壳、也没走捷径,每一行代码都够“纯血”。与姊妹产品RainbowChat和RainbowChat-Web 技术同源,历经考验。
98 1
|
3月前
|
存储 SQL 前端开发
跟老卫学HarmonyOS开发:ArkTS关系型数据库开发
本节以“账本”为例,使用关系型数据库接口实现账单的增、删、改、查操作。通过创建ArkTSRdb应用,演示如何操作RdbStore进行数据管理,并结合界面按钮实现交互功能。
129 0
跟老卫学HarmonyOS开发:ArkTS关系型数据库开发