HarmonyOS:ArkTS 多态样式自学指南

简介: 本文介绍了 ArkTS 多态样式功能,帮助开发者为组件设置不同状态(如点击、按下、禁用等)下的样式。从 API Version 8 开始支持,API Version 11 引入 `attributeModifier` 动态设置属性。核心接口 `stateStyles` 支持多种状态,如 `normal`、`pressed`、`disabled` 等。文章通过示例代码展示了如何为 `Text` 和 `Radio` 组件设置多态样式,结合状态控制实现动态视觉反馈。掌握此功能可提升用户体验,推荐开发者根据需求灵活运用。

在日常的 ArkTS 应用开发工作中,我常常面临着为组件设置不同状态样式的需求。用户与界面进行交互时,如点击、按下、选中、禁用等操作,都希望组件能呈现出相应的视觉反馈,以提升用户体验。然而,传统的样式设置方式在处理这些动态变化时显得力不从心,代码变得冗长且难以维护。直到我接触到了 ArkTS 的多态样式,它为我提供了一种简洁而强大的解决方案,让我能够轻松地为组件设置不同状态下的样式。为了帮助更多开发者掌握这一实用的功能,我决定撰写这篇自学指南。

一、多态样式概述

多态样式允许开发者为组件设置不同状态下的样式,从 API Version 8 开始支持。从 API Version 11 开始,还支持另一种写法 ​​attributeModifier​​​,可根据开发者的需求动态设置属性。多态样式主要通过 ​​stateStyles​​​ 接口来实现,该接口从 API version 9 开始支持在 ArkTS 卡片中使用,从 API version 11 开始支持在元服务中使用,其系统能力依赖于 ​​SystemCapability.ArkUI.ArkUI.Full​​。

1. ​​stateStyles​​ 接口

​stateStyles​​​ 接口用于设置组件不同状态的样式,其参数 ​​value​​​ 类型为 ​​StateStyles​​,是必填项。

​StateStyles​​ 接口说明

​StateStyles​​ 接口支持多种状态,从 API version 9 开始支持在 ArkTS 卡片中使用,且只支持通用属性。从 API version 11 开始支持在元服务中使用。以下是各种状态的说明:

  • ​normal​​​:组件无状态时的样式,类型为 ​​() => void​​,可选参数。
  • ​pressed​​​:组件按下状态的样式,类型为 ​​() => void​​,可选参数。
  • ​disabled​​​:组件禁用状态的样式,类型为 ​​() => void​​,可选参数。
  • ​focused​​​:组件获焦状态的样式,类型为 ​​() => void​​,可选参数。
  • ​clicked​​​:组件点击状态的样式,类型为 ​​() => void​​,可选参数。
  • ​selected​(从 API 10 开始) :组件选中状态的样式,类型为 ​​() => void​​,可选参数。

​selected​​ 选中状态说明

当前多态样式的选中状态样式依赖组件选中属性值,可以使用 ​​onClick​​​ 修改属性值,或使用属性自带的 ​`​$$​`​​ 双向绑定功能。目前支持 ​`​selected​`​ 的组件及其参数 / 属性值如下: | 组件 | 支持的参数 / 属性 | 起始 API 版本 | | ------------- | ---------- | --------- | | Checkbox | select | 10 | | CheckboxGroup | selectAll | 10 | | Radio | checked | 10 | | Toggle | isOn | 10 | | ListItem | selected | 10 | | GridItem | selected | 10 | | MenuItem | selected | 10 | ## 二、示例代码分析与拓展 ### 示例 1:设置 ​`​Text​`​ 多态样式 以下是设置 ​`​Text​`​​ 组件在 ​`​pressed​`​​ 和 ​`​disabled​`​ 状态下样式变化的示例代码: // xxx.ets @Entry @Component struct StyleExample { @State isEnable: boolean = true @Styles pressedStyles(): void { .backgroundColor("#FF8C00") // 修改背景颜色为橙色 .borderRadius(15) // 增大圆角半径 .borderStyle(BorderStyle.Dotted) // 改变边框样式为点状 .borderWidth(3) // 增加边框宽度 .borderColor("#66000000") // 修改边框颜色 .width(130) // 增加宽度 .height(35) // 增加高度 .opacity(0.9) // 调整透明度 } @Styles disabledStyles(): void { .backgroundColor("#D3D3D3") // 修改背景颜色为浅灰色 .borderRadius(12) // 调整圆角半径 .borderStyle(BorderStyle.Dashed) // 改变边框样式为虚线 .borderWidth(2) // 边框宽度 .borderColor("#4a6c3919") // 修改边框颜色 .width(100) // 调整宽度 .height(30) // 调整高度 .opacity(0.8) // 调整透明度 } @Styles normalStyles(): void { .backgroundColor("#00BFFF") // 修改背景颜色为深天蓝色 .borderRadius(12) // 圆角半径 .borderStyle(BorderStyle.Solid) // 边框样式为实线 .borderWidth(2) // 边框宽度 .borderColor("#33000000") // 边框颜色 .width(110) // 宽度 .height(30) // 高度 .opacity(0.9) // 透明度 } build() { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center }) { Text("normal") .fontSize(16) // 增大字体大小 .fontColor(Color.White) .opacity(0.6) // 调整透明度 .stateStyles({ normal: this.normalStyles, }) .margin({ bottom: 25 }) // 增加底部边距 .textAlign(TextAlign.Center) Text("pressed") .backgroundColor("#00BFFF") .borderRadius(25) // 增大圆角半径 .borderStyle(BorderStyle.Dotted) // 改变边框样式为双实线 .borderWidth(3) // 增加边框宽度 .borderColor(Color.Orange) // 修改边框颜色为橙色 .width(110) // 宽度 .height(30) // 高度 .opacity(0.9) // 透明度 .fontSize(16) // 增大字体大小 .fontColor(Color.White) .stateStyles({ pressed: this.pressedStyles, }) .margin({ bottom: 25 }) // 增加底部边距 .textAlign(TextAlign.Center) Text(this.isEnable == true ? "effective" : "disabled") .backgroundColor("#00BFFF") .borderRadius(25) // 增大圆角半径 .borderStyle(BorderStyle.Solid) // 边框样式为实线 .borderWidth(3) // 增加边框宽度 .borderColor(Color.Gray) .width(110) // 宽度 .height(30) // 高度 .opacity(0.9) // 透明度 .fontSize(16) // 增大字体大小 .fontColor(Color.White) .enabled(this.isEnable) .stateStyles({ disabled: this.disabledStyles, }) .textAlign(TextAlign.Center) Text("control disabled") .onClick(() => { this.isEnable = !this.isEnable console.log(`${this.isEnable}`) }) } .width(400).height(350) // 调整容器大小 } } ![db6cf039563e47469d4edf2e5271a7ea.png](https://ucc.alicdn.com/pic/developer-ecology/vyrasw62tzam4_51b5f56f1bce417c8cadee4ce0e70af6.png) #### 代码分析 * **状态样式定义**:通过 ​`​@Styles​`​​ 装饰器定义了 ​`​pressedStyles​`​​、​`​disabledStyles​`​​ 和 ​`​normalStyles​`​ 三种状态的样式。在每个样式函数中,设置了组件在不同状态下的背景颜色、边框样式、宽度、高度等属性。 * **组件状态设置**:在 ​`​Text​`​​ 组件中,使用 ​`​stateStyles​`​​ 接口为不同状态的 ​`​Text​`​​ 组件设置相应的样式。例如,对于 ​`​pressed​`​​ 状态的 ​`​Text​`​​ 组件,当用户按下时,会应用 ​`​pressedStyles​`​ 中定义的样式。 * **状态控制**:通过 ​`​@State​`​​ 装饰器定义了 ​`​isEnable​`​​ 状态变量,用于控制 ​`​Text​`​​ 组件的启用和禁用状态。点击 ​`​control disabled​`​​ 文本时,会切换 ​`​isEnable​`​​ 的值,从而改变 ​`​Text​`​ 组件的状态。 ### 示例 2:设置 ​`​Radio​`​ 多态样式 以下是设置 ​`​Radio​`​​ 组件在 ​`​selected​`​ 状态下样式变化的示例代码: // xxx.ets @Entry @Component struct Index { @State value: boolean = false @State value2: boolean = false @Styles normalStyles(): void { .backgroundColor("#F5F5F5") // 修改背景颜色为淡灰色 } @Styles selectStyles(): void { .backgroundColor("#FF6347") // 修改背景颜色为番茄红色 .borderWidth(3) // 增加边框宽度 .borderColor("#8B0000") // 修改边框颜色为深红色 } build() { Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { Column() { Text('Radio1') .fontSize(28) // 增大字体大小 Radio({ value: 'Radio1', group: 'radioGroup1' }) .checked(this.value) .height(55) // 增加高度 .width(55) // 增加宽度 .borderWidth(1) // 调整边框宽度 .borderRadius(35) // 增大圆角半径 .onClick(() => { this.value = !this.value }) .stateStyles({ normal: this.normalStyles, selected: this.selectStyles, }) } .margin(35) // 增加外边距 Column() { Text('Radio2') .fontSize(28) // 增大字体大小 Radio({ value: 'Radio2', group: 'radioGroup2' }) .checked($$this.value2)
.height(55) // 增加高度
.width(55) // 增加宽度
.borderWidth(1) // 调整边框宽度
.borderRadius(35) // 增大圆角半径
.stateStyles({
normal: this.normalStyles,
selected: this.selectStyles,
})
}
.margin(35) // 增加外边距
}.padding({ top: 35 }) // 增加顶部内边距
}
}

2025-03-30 23-57-32.2025-03-30 23_57_47.gif

代码分析

  • 状态样式定义:同样使用 ​​@Styles​​​ 装饰器定义了 ​​normalStyles​​​ 和 ​​selectStyles​​​ 两种状态的样式。​​normalStyles​​​ 定义了 ​​Radio​​​ 组件在正常状态下的背景颜色,​​selectStyles​​​ 定义了 ​​Radio​​ 组件在选中状态下的背景颜色和边框样式。
  • 组件状态设置:在 ​​Radio​​​ 组件中,使用 ​​stateStyles​​​ 接口为 ​​Radio​​​ 组件设置正常状态和选中状态的样式。当用户选中某个 ​​Radio​​​ 组件时,会应用 ​​selectStyles​​ 中定义的样式。
  • 状态控制:通过 ​​@State​​​ 装饰器定义了 ​​value​​​ 和 ​​value2​​​ 两个状态变量,分别用于控制两个 ​​Radio​​​ 组件的选中状态。点击 ​​Radio​​ 组件时,会切换相应的状态变量的值。

三、总结

ArkTS 的多态样式为开发者提供了一种强大而灵活的方式来设置组件在不同状态下的样式。通过合理运用 ​​stateStyles​​​ 接口和 ​​StateStyles​​ 接口,可以轻松地为组件添加动态的视觉反馈,提升用户体验。在实际开发中,建议根据具体需求为不同的组件设置合适的状态样式,并注意处理好状态之间的切换逻辑。

最后如果这篇文章对你有帮助,希望您能关注,点赞,加收藏哦~~~~

目录
相关文章
|
14天前
|
人工智能 JavaScript 安全
【HarmonyOS NEXT+AI】问答05:ArkTS和仓颉编程语言怎么选?
本文针对学员关于“鸿蒙主推开发语言是ArkTS,为何课程使用仓颉语言”的疑问进行解答。文章回顾了鸿蒙编程语言的发展历程:从早期支持JS和C/C++,到HarmonyOS 2引入Java,再到HarmonyOS 3推出ArkTS,直至HarmonyOS 5(NEXT)引入仓颉语言。仓颉作为华为自研的现代编程语言,具备高效编程、安全可靠、轻松并发和卓越性能等特性,适用于高性能高并发场景及未来AI原生应用开发。文章还探讨了仓颉与ArkTS的关系、应用场景以及是否需要重写现有应用等问题,为开发者选择编程语言提供了参考依据。
78 13
【HarmonyOS NEXT+AI】问答05:ArkTS和仓颉编程语言怎么选?
|
16天前
|
JavaScript 前端开发 API
什么是声明式UI什么是命令式UI?鸿蒙ArkTS为什么是声明式UI-优雅草卓伊凡
什么是声明式UI什么是命令式UI?鸿蒙ArkTS为什么是声明式UI-优雅草卓伊凡
74 12
什么是声明式UI什么是命令式UI?鸿蒙ArkTS为什么是声明式UI-优雅草卓伊凡
|
2天前
|
存储 开发框架 数据管理
【HarmonyOS Next之旅】ArkTS语法(一)
【HarmonyOS之旅】ArkTS语法(一)
34 12
|
3天前
|
存储 JSON 安全
HarmonyOS5云服务技术分享--ArkTS调用函数
本指南详细介绍了如何使用HarmonyOS的ArkTS语言通过云函数实现文件获取功能。从前期准备到核心四步(创建HTTP触发器、获取关键信息、编写调用代码、处理返回数据),手把手教你轻松上手。文中提供完整代码模板,包含基础与高级配置示例,并分享实战技巧和避坑指南,助你高效开发!适合初学者入门,快来尝试吧!
|
3天前
|
监控 JavaScript Java
HarmonyOS5云服务技术分享--ArkTS开发函数
本文详细介绍如何通过命令行调试HarmonyOS云函数,提升开发效率。支持Node.js 14.x/18.x与Java 1.8环境,提供HTTP触发器调用及持续开发支持。内容涵盖准备工作、五步调试法(环境配置、编写测试函数、启动本地调试、发送测试请求、高级调试技巧)以及避坑指南。最后分享部署上线与小贴士,助你轻松调试云函数,节省时间!
|
3天前
|
人工智能 监控 JavaScript
HarmonyOS5云服务技术分享--ArkTS开发Node环境
本文详细讲解了在HarmonyOS(ArkTS API 9及以上)中使用云函数的开发技巧,结合Node.js和HTTP触发器,从零开始手把手教学。内容涵盖核心能力、开发流程(配置到部署)、高阶优化及常见问题解决,并提供实际应用场景示例。助你快速掌握Serverless开发,提升效率,探索跨端协作与AI集成等未来方向。
|
1月前
|
缓存 开发工具 开发者
鸿蒙NEXT开发App相关工具类(ArkTs)
这段代码展示了一个名为鸿蒙NEXT开发 `AppUtil` 的工具类,主要用于管理鸿蒙应用的上下文、窗口、状态栏、导航栏等配置。它提供了多种功能,例如设置灰阶模式、颜色模式、字体类型、屏幕亮度、窗口属性等,并支持获取应用包信息(如版本号、包名等)。该工具类需在 UIAbility 的 `onWindowStageCreate` 方法中初始化,以便缓存全局变量。代码由鸿蒙布道师编写,适用于鸿蒙系统应用开发,帮助开发者更便捷地管理和配置应用界面及系统属性。
鸿蒙NEXT开发App相关工具类(ArkTs)
|
3天前
|
Android开发 容器
鸿蒙开发:使用nestedScroll解决滑动冲突
nestedScroll属性的作用,主要是,用于设置嵌套滚动选项,设置前后两个方向的嵌套滚动模式,实现与父组件的滚动联动。
39 19
鸿蒙开发:使用nestedScroll解决滑动冲突
|
5天前
|
缓存 JSON JavaScript
鸿蒙开发实现图片上传(上传用户头像)
本内容介绍了一种基于HarmonyOS的应用场景,主要实现图片选择、拷贝到缓存目录以及上传的功能。首先通过系统文件选择器(FilePicker)选择图片,无需额外权限;接着使用`fs`模块将选中的图片复制到应用缓存目录(cacheDir),以满足上传功能的路径要求;最后利用`request.uploadFile`方法将图片上传至服务器,并处理响应结果。代码详细展示了每个步骤的实现逻辑,包括图片选择、文件操作和网络请求,适用于需要实现图片上传功能的开发者。
|
3天前
|
IDE 文件存储 开发工具
鸿蒙开发:应用上架第一篇,生成密钥和证书请求文件
本系列文章,我们就着重概述一下,在鸿蒙当中,如何打出一个上架包,一个上架包的产出,需要多个步骤,本篇文章,我们先从第一步骤进行讲解,也就是如何生成秘钥和证书请求文件。
25 13
鸿蒙开发:应用上架第一篇,生成密钥和证书请求文件