鸿蒙UI开发——自定义主题色

ops/2024/12/26 15:14:50/

1、概述

ArkTs提供了应用内主题切换功能,支持全局主题切换,也支持局部主题切换,效果如下。本文针对主题切换做简单介绍。

图片

2、主题色

ArkTs提供了一套内置主题配色,有Colors对象持有,它包含了默认情况下,关于主题的基本资源枚举,枚举的key与说明如下:

brand  品牌色。warning  一级警示色。alert  二级提示色。confirm  确认色。fontPrimary  一级文本字体颜色。fontSecondary  二级文本字体颜色。fontTertiary  三级文本字体颜色。fontFourth  四级文本字体颜色。fontEmphasize  高亮字体颜色。fontOnPrimary  一级文本反转颜色,用于彩色背景。fontOnSecondary  二级文本反转颜色,用于彩色背景。fontOnTertiary  三级文本反转颜色,用于彩色背景。fontOnFourth  四级文本反转颜色,用于彩色背景。iconPrimary  一级图标颜色。iconSecondary  二级图标颜色。iconTertiary  三级图标颜色。iconFourth  四级图标颜色。iconEmphasize  高亮图标颜色。iconSubEmphasize  高亮辅助图标颜色。iconOnPrimary  一级图标反转颜色,用于彩色背景。iconOnSecondary  二级图标反转颜色,用于彩色背景。iconOnTertiary  三级图标反转颜色,用于彩色背景。iconOnFourth  四级图标反转颜色,用于彩色背景。backgroundPrimary  一级背景颜色(实色,不透明)。backgroundSecondary  二级背景颜色(实色,不透明)。backgroundTertiary  三级背景颜色(实色,不透明)。backgroundFourth  四级背景颜色(实色,不透明)。backgroundEmphasize  高亮背景颜色(实色,不透明)。compForegroundPrimary  前背景。compBackgroundPrimary  白色背景。compBackgroundPrimaryTran  白色透明背景。compBackgroundPrimaryContrary  常亮背景。compBackgroundGray  灰色背景。compBackgroundSecondary  二级背景。compBackgroundTertiary  三级背景。compBackgroundEmphasize  高亮背景。compBackgroundNeutral  黑色中性高亮背景颜色。compEmphasizeSecondary  20%高亮背景颜色。compEmphasizeTertiary  10%高亮背景颜色。compDivider  通用分割线颜色。compCommonContrary  通用反转颜色。compBackgroundFocus  获焦态背景颜色。compFocusedPrimary  获焦态一级反转颜色。compFocusedSecondary  获焦态二级反转颜色。compFocusedTertiary  获焦态三级反转颜色。interactiveHover  通用悬停交互式颜色。interactivePressed  通用按压交互式颜色。interactiveFocus  通用获焦交互式颜色。interactiveActive  通用激活交互式颜色。interactiveSelect  通用选择交互式颜色。interactiveClick  通用点击交互式颜色。

对应的颜色罗列如下:

Token场景类别LightDark
theme.colors.brand品牌色#ff0a59f7

图片

#ff317af7

图片

theme.colors.warning一级警示色#ffe84026

图片

#ffd94838

图片

theme.colors.alert二级警示色#ffed6f21

图片

#ffdb6b42

图片

theme.colors.confirm确认色#ff64bb5c

图片

#ff5ba854

图片

theme.colors.fontPrimary一级文本#e5000000

图片

#e5ffffff

图片

theme.colors.fontSecondary二级文本#99000000

图片

#99ffffff

图片

theme.colors.fontTertiary三级文本#66000000

图片

#66ffffff

图片

theme.colors.fontFourth四级文本#33000000

图片

#33ffffff

图片

theme.colors.fontEmphasize高亮文本#ff0a59f7

图片

#ff317af7

图片

theme.colors.fontOnPrimary一级文本反色#ffffffff

图片

#ff000000

图片

theme.colors.fontOnSecondary二级文本反色#99ffffff

图片

#99000000

图片

theme.colors.fontOnTertiary三级文本反色#66ffffff

图片

#66000000

图片

theme.colors.fontOnFourth四级文本反色#33ffffff

图片

#33000000

图片

theme.colors.iconPrimary一级图标#e5000000

图片

#e5ffffff

图片

theme.colors.iconSecondary二级图标#99000000

图片

#99ffffff

图片

theme.colors.iconTertiary三级图标#66000000

图片

#66ffffff

图片

theme.colors.iconFourth四级图标#33000000

图片

#33ffffff

图片

theme.colors.iconEmphasize高亮图标#ff0a59f7

图片

#ff317af7

图片

theme.colors.iconSubEmphasize高亮辅助图标#660a59f7

图片

#66317af7

图片

theme.colors.iconOnPrimary一级图标反色#ffffffff

图片

#ff000000

图片

theme.colors.iconOnSecondary二级图标反色#99ffffff

图片

#99000000

图片

theme.colors.iconOnTertiary三级图标反色#66ffffff

图片

#66000000

图片

theme.colors.iconOnFourth四级图标反色#33ffffff

图片

#33000000

图片

theme.colors.backgroundPrimary一级背景(实色/不透明色)#ffffffff

图片

#ffe5e5e5

图片

theme.colors.backgroundSecondary二级背景(实色/不透明色)#fff1f3f5

图片

#ff191a1c

图片

theme.colors.backgroundTertiary三级背景(实色/不透明色)#ffe5e5ea

图片

#ff202224

图片

theme.colors.backgroundFourth四级背景(实色/不透明色)#ffd1d1d6

图片

#ff2e3033

图片

theme.colors.backgroundEmphasize高亮背景(实色/不透明色)#ff0a59f7

图片

#ff317af7

图片

theme.colors.compForegroundPrimary前背景#ff000000

图片

#ffe5e5e5

图片

theme.colors.compBackgroundPrimary白色背景#ffffffff

图片

#ffffffff

图片

theme.colors.compBackgroundPrimaryTran白色透明背景#ffffffff

图片

#33ffffff

图片

theme.colors.compBackgroundPrimaryContrary常亮背景#ffffffff

图片

#ffe5e5e5

图片

theme.colors.compBackgroundGray灰色背景#fff1f3f5

图片

#ffe5e5ea

图片

theme.colors.compBackgroundSecondary二级背景#19000000

图片

#19ffffff

图片

theme.colors.compBackgroundTertiary三级背景#0c000000

图片

#0cffffff

图片

theme.colors.compBackgroundEmphasize高亮背景#ff0a59f7

图片

#ff317af7

图片

theme.colors.compBackgroundNeutral黑色中性高亮背景#ff000000

图片

#ffffffff

图片

theme.colors.compEmphasizeSecondary20%高亮背景#330a59f7

图片

#33317af7

图片

theme.colors.compEmphasizeTertiary10%高亮背景#190a59f7

图片

#19317af7

图片

theme.colors.compDivider分割线颜色#33000000

图片

#33ffffff

图片

theme.colors.compCommonContrary通用反色#ffffffff

图片

#ff000000

图片

theme.colors.compBackgroundFocus获焦态背景色#fff1f3f5

图片

#ff000000

图片

theme.colors.compFocusedPrimary获焦态一级反色#e5000000

图片

#e5ffffff

图片

theme.colors.compFocusedSecondary获焦态二级反色#99000000

图片

#99ffffff

图片

theme.colors.compFocusedTertiary获焦态三级反色#66000000

图片

#66ffffff

图片

theme.colors.interactiveHover通用悬停交互式颜色#0c000000

图片

#0cffffff

图片

theme.colors.interactivePressed通用按压交互式颜色#19000000

图片

#19ffffff

图片

theme.colors.interactiveFocus通用获焦交互式颜色#ff0a59f7

图片

#ff317af7

图片

theme.colors.interactiveActive通用激活交互式颜色#ff0a59f7

图片

#ff317af7

图片

theme.colors.interactiveSelect通用选择交互式颜色#33000000

图片

#33ffffff

图片

theme.colors.interactiveClick通用点击交互式颜色#19000000

图片

#19ffffff

图片

我们可以在默认值的基础上对指定的颜色值做复写,其余部分将会使用默认值。假设我们需要修改几个颜色:brand、fontPrimary、iconOnPrimary、iconFourth,修改方法示意如下:

 // AppTheme.etsimport { CustomColors, CustomTheme } from '@kit.ArkUI'export class AppColors implements CustomColors {  //自定义主题色  brand = 0xFF75D9;  fontPrimary = 0xFFD53032  iconOnPrimary = 0xFFD53032  iconFourth = 0xFFD53032}export class AppTheme implements CustomTheme {  public colors: AppColors = new AppColors()}export let gAppTheme: CustomTheme = new AppTheme()

2.1、设置自定义全局主题

我们可以在UIAbility中设置ThemeControl,在onWindowStageCreate()方法中setDefaultTheme,设置应用内组件的自定义主题色。

代码如下(26行):​​

// EntryAbility.etsimport {AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';import { hilog } from '@kit.PerformanceAnalysisKit';import { window, CustomColors, ThemeControl } from '@kit.ArkUI';import { gAppTheme } from './AppTheme'export default class EntryAbility extends UIAbility {  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');  }  onDestroy() {    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');  }  onWindowStageCreate(windowStage: window.WindowStage) {    // Main window is created, set main page for this ability    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');      windowStage.loadContent('pages/Index', (err, data) => {      if (err.code) {        hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');        return;      }      hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');      // 在onWindowStageCreate()方法中setDefaultTheme      ThemeControl.setDefaultTheme(gAppTheme)      hilog.info(0x0000, 'testTag', '%{public}s', 'ThemeControl.setDefaultTheme done');    });  }}

设置好后,我们写一个Page,代码如下:​​​​​​​

@Entry@Componentstruct DisplayPage {  build() {    Column() {      List({ space: 10 }) {        ListItem() {          Column({ space: '5vp' }) {            Text('Color mode')              .margin({ top: '5vp', left: '14fp' })              .width('100%')            Row() {              Column() {                Text('Light')                  .fontSize('16fp')                  .textAlign(TextAlign.Start)                  .alignSelf(ItemAlign.Center)                Radio({ group: 'light or dark', value: 'light' })                  .checked(true)              }              .width('50%')              Column() {                Text('Dark')                  .fontSize('16fp')                  .textAlign(TextAlign.Start)                  .alignSelf(ItemAlign.Center)                Radio({ group: 'light or dark', value: 'dark' })              }              .width('50%')            }          }          .width('100%')          .height('90vp')          .borderRadius('10vp')        }        ListItem() {          Column() {            Text('Brightness')              .width('100%')              .margin({ top: '5vp', left: '14fp' })            Slider({ value: 40, max: 100 })          }          .width('100%')          .height('70vp')          .borderRadius('10vp')        }        ListItem() {          Column() {            Row() {              Column({ space: '5vp' }) {                Text('Touch sensitivity')                  .fontSize('16fp')                  .textAlign(TextAlign.Start)                  .width('100%')                Text('Increase the touch sensitivity of your screen' +                  ' for use with screen protectors')                  .fontSize('12fp')                  .fontColor(Color.Blue)                  .textAlign(TextAlign.Start)                  .width('100%')              }              .alignSelf(ItemAlign.Center)              .margin({ left: '14fp' })              .width('75%')              Toggle({ type: ToggleType.Switch, isOn: true })                .margin({ right: '14fp' })                .alignSelf(ItemAlign.Center)            }            .width('100%')            .height('80vp')          }          .width('100%')          .borderRadius('10vp')        }      }    }    .padding('10vp')    .backgroundColor('#dcdcdc')    .width('100%')    .height('100%')  }}

效果如下(注意,在预览器里面看到的效果是默认主题效果,需要真机或模拟器才可以看到真实效果):

图片

默认情况下,效果如下:

图片

2.3、Page中获取自定义主题

我们可以在onWillApplyTheme回调函数获取用于使自定义组件获取当前生效的Theme对象。我们可以获取自定义的主题对象,读取指定的主题色值,代码示例如下(9 ~ 10行):​​​​​​

  import { Theme, ThemeControl } from '@kit.ArkUI'  @Entry  @Component  struct DisplayPage {    @State menuItemColor: ResourceColor = $r('sys.color.background_primary')        onWillApplyTheme(theme: Theme) {      // theme是当前生效的主题对象      this.menuItemColor = theme.colors.backgroundPrimary;    }      build() {    // ...    }  }

2.4、局部应用主题色

我们可以通过设置WithTheme,将自定义主题Theme的配色应用于内部组件的默认样式。在WithTheme的作用范围内,组件的配色会根据Theme的配色进行调整。代码如下(29行):​​​​​​​

import { CustomColors, CustomTheme, Theme } from '@kit.ArkUI'class AppColors implements CustomColors {  fontPrimary: Color = Color.Pink;  backgroundEmphasize: Color = Color.Pink;}class AppColorsSec implements CustomColors {  fontPrimary: Color = Color.Orange;  backgroundEmphasize: Color = Color.Orange;}class AppTheme implements CustomTheme {  public colors: AppColors = new AppColors()}class AppThemeSec implements CustomTheme {  public colors: AppColors = new AppColorsSec()}@Entry@Componentstruct DisplayPage {  @State customTheme: CustomTheme = new AppTheme()  @State message: string = '切换自定义主题风格'  count = 0;  build() {    WithTheme({ theme: this.customTheme }) {      Row(){        Column() {          Text('WithTheme')            .fontSize(30)            .margin({bottom: 10})          Text(this.message)            .margin({bottom: 10})          Button('切换主题').onClick(() => {            this.count++;            if (this.count > 1) {              this.count = 0;            }            switch (this.count) {              case 0:                this.customTheme = new AppTheme();                break;              case 1:                this.customTheme = new AppThemeSec();                break;            }          })        }        .width('100%')      }      .height('100%')      .width('100%')    }  }}

如示例代码所示,使用WithTheme({ theme: this.myTheme })可将作用域内组件的配色设置为自定义主题风格。后续可以通过更新this.myTheme来更换主题风格。onWillApplyTheme回调函数用于使自定义组件能够获取当前生效的Theme对象。效果如下:

图片


http://www.ppmy.cn/ops/145146.html

相关文章

数据结构之栈,队列,树

目录 一.栈 1.栈的概念及结构 2.栈的实现 3.实现讲解 1.初始化栈 2.销毁栈 3.压栈 4.出栈 5.返回栈顶元素 6.返回栈内元素个数 7.判断栈内是否为空 二.队列 1.队列的概念及结构 2.队列的实现 3.实现讲解 1.初始化队列 2.销毁队列 3.单个成员入队列 4.单个成员…

08 Django - Django媒体文件静态文件文件上传

九、Django媒体文件&静态文件&文件上传 1.静态文件和媒体文件 媒体文件: 用户上传的文件, 叫做media静态文件: 存放在服务器的 css, js, image等,叫做static 在Django中使用静态文件 {% static img/example.jpg %} > static模板关键字就是在settings.py中指定的…

前端Pako.js 压缩解压库 与 Java 的 zlib 压缩与解压 的互通实现

工具介绍: pako.js 前端压缩解压的库(包含 zlib 和gzip 两种实现,这里只介绍 zlib) pako 2.0.4 API documentation Java8 原生支持 zlib 和 gzip 业务场景 因为数据太大,网络环境不可控。故前端需要将数据 A 先压缩…

PCL点云库入门——PCL库点云滤波算法之直通滤波(PassThrough)和条件滤波(ConditionalRemoval)

0、滤波算法概述 PCL点云库中的滤波算法是处理点云数据不可或缺的一部分,它们能够有效地去除噪声、提取特征或进行数据降维。例如,使用体素网格滤波(VoxelGrid)可以减少点云数据量,同时保留重要的形状特征。此外&#…

Leetcode经典题20--长度最小的子数组

题目描述 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 输入输出示例 输入&…

【Django】测试带有 CSRF 验证的 POST 表单 API 报错:Forbidden (CSRF cookie not set.)

【Django】测试带有 CSRF 验证的 POST 表单 API 报错:Forbidden (CSRF cookie not set.) 问题描述 Django 使用 Apifox 测试 POST 表单报错。 Forbidden (CSRF cookie not set.): /api/parse [20/Dec/2024 15:17:25] "POST //api/parse HTTP/1.1" 403 …

YoloDotNet OBB(定向边界框)

文章目录 前言1、代码示例引入命名空间:初始化 Yolo 对象:加载图像和执行 OBB 检测:处理检测结果:2、自定义 OBB 绘制(可选)3、性能和准确性考虑前言 OBB(Oriented Bounding Box)在目标检测中用于更精确地框定非水平或垂直放置的物体。与常规边界框不同,OBB 可以根据物…

vscode的keil assistant 中搜索不到全局变量

搜不到 但是在包含的文件中输入 ../../../,就是全局搜索的结果 我的文件结构是:\Desktop\LVGL文件系统移植(lvgl8.3)\Projects\MDK-ARM 盲猜是keil assistant 当前文件夹打开的时候是进入到了MDK-ARM文件夹层次&…