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

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

前言


无论是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)
相关文章
|
6月前
|
安全 Android开发 iOS开发
探索安卓与iOS开发的差异:平台特性与用户体验的深度对比
在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。本文旨在通过数据驱动的分析方法,深入探讨这两大操作系统在开发环境、用户界面设计及市场表现等方面的差异。引用最新的行业报告和科研数据,结合技术专家的观点,本文将提供对开发者和市场分析师均有价值的洞见。
|
7天前
|
物联网 调度 vr&ar
鸿蒙HarmonyOS应用开发 |鸿蒙技术分享HarmonyOS Next 深度解析:分布式能力与跨设备协作实战
鸿蒙技术分享:HarmonyOS Next 深度解析 随着万物互联时代的到来,华为发布的 HarmonyOS Next 在技术架构和生态体验上实现了重大升级。本文从技术架构、生态优势和开发实践三方面深入探讨其特点,并通过跨设备笔记应用实战案例,展示其强大的分布式能力和多设备协作功能。核心亮点包括新一代微内核架构、统一开发语言 ArkTS 和多模态交互支持。开发者可借助 DevEco Studio 4.0 快速上手,体验高效、灵活的开发过程。 239个字符
159 13
鸿蒙HarmonyOS应用开发 |鸿蒙技术分享HarmonyOS Next 深度解析:分布式能力与跨设备协作实战
|
1天前
|
开发框架 小程序 IDE
鸿蒙原生开发手记:05-开发之外的那些事
鸿蒙原生开发手记:05-开发之外的那些事
27 9
|
3月前
|
编解码 前端开发 JavaScript
前端移动端适配方案
【9月更文挑战第8天】前端移动端适配方案
120 0
|
4月前
|
前端开发 小程序
移动端适配方案
【8月更文挑战第1天】
|
5月前
|
编解码 前端开发 图形学
【技术深度解析】多平台适配下的UI适配难题:U3D游戏UI错乱的终极解决方案
【7月更文第12天】随着移动设备市场的多元化,Unity游戏开发者面临的一大挑战是如何在不同分辨率和屏幕尺寸的设备上保持UI的一致性和美观性。游戏在高分辨率平板与低分辨率手机上呈现出的UI布局混乱、按钮错位等问题,严重影响玩家体验。本文旨在探讨Unity UI(UGUI)在多平台适配中的最佳实践,通过优化Canvas Scaler设置、灵活运用RectTransform和Anchor Points,以及高效利用设计工具,确保UI的完美适配。
773 1
|
6月前
|
小程序 存储 UED
如何实现一次搭建 多平台适配的小程序
【6月更文挑战第3天】如何实现一次搭建 多平台适配的小程序
|
7月前
|
Web App开发 前端开发 UED
谈谈你是如何做移动端适配的?
对于移动端适配,一种常用的方法是响应式布局(Responsive Layout)和媒体查询(Media Queries)。以下是一些常见的移动端适配策略:
47 0
|
7月前
|
Web App开发 编解码 前端开发
如何做移动端适配?
如何做移动端适配?
67 0
|
JavaScript
深入了解移动端适配的方案
深入了解移动端适配的方案
266 0