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​​ 接口,可以轻松地为组件添加动态的视觉反馈,提升用户体验。在实际开发中,建议根据具体需求为不同的组件设置合适的状态样式,并注意处理好状态之间的切换逻辑。

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

目录
打赏
0
29
27
5
166
分享
相关文章
harmonyOS基础- 快速弄懂HarmonyOS ArkTs基础组件、布局容器(前端视角篇)
本文由黑臂麒麟(6年前端经验)撰写,介绍ArkTS开发中的常用基础组件与布局组件。基础组件包括Text、Image、Button等,支持样式设置如字体颜色、大小和加粗等,并可通过Resource资源引用统一管理样式。布局组件涵盖Column、Row、List、Grid和Tabs等,支持灵活的主轴与交叉轴对齐方式、分割线设置及滚动事件监听。同时,Tabs组件可实现自定义样式与页签切换功能。内容结合代码示例,适合初学者快速上手ArkTS开发。参考华为开发者联盟官网基础课程。
153 75
harmonyOS基础- 快速弄懂HarmonyOS ArkTs基础组件、布局容器(前端视角篇)
HarmonyOS:ArkTS RowSplit 组件自学指南
在 ArkTS 开发中,复杂界面布局需求常见,尤其需要灵活调整子组件宽度时,传统方式难以满足动态交互需求。`RowSplit` 组件解决了这一问题,支持横向布局并插入可拖动的分割线,让用户轻松调整子组件宽度,提升体验。本文详细介绍了 `RowSplit` 的功能、接口、属性及使用示例,帮助开发者掌握其用法,并总结了注意事项。通过合理配置,可实现灵活美观的布局效果。希望对您有帮助,欢迎关注、点赞和收藏!
75 31
|
28天前
|
HarmonyOS:ArkTS Path 组件自学指南
在鸿蒙应用开发中,绘制复杂图形常面临传统布局方式难以满足需求的问题。ArkTS 的 Path 组件提供了解决方案,如同一把“神奇画笔”,支持通过灵活的命令和属性绘制直线、曲线、椭圆弧等多样图形。本文详细介绍了 Path 组件从 API Version 7 起的功能特性,包括 `commands`、`fill`、`stroke` 等核心属性,以及各类绘图命令如 `M`(移动)、`L`(直线)、`C`(贝塞尔曲线)等。结合示例代码,展示了如何绘制简单直线到复杂曲线图形,并拓展了颜色、透明度和线条样式的自定义方法。掌握 Path 组件,可为应用带来更丰富生动的视觉体验,助力开发者实现创意绘图需求。
74 21
鸿蒙NEXT开发App相关工具类(ArkTs)
这段代码展示了一个名为鸿蒙NEXT开发 `AppUtil` 的工具类,主要用于管理鸿蒙应用的上下文、窗口、状态栏、导航栏等配置。它提供了多种功能,例如设置灰阶模式、颜色模式、字体类型、屏幕亮度、窗口属性等,并支持获取应用包信息(如版本号、包名等)。该工具类需在 UIAbility 的 `onWindowStageCreate` 方法中初始化,以便缓存全局变量。代码由鸿蒙布道师编写,适用于鸿蒙系统应用开发,帮助开发者更便捷地管理和配置应用界面及系统属性。
|
27天前
|
HarmonyOS NEXT - 样式装饰器:@Styles和@Extend
简介:本文介绍了用于提升代码简洁性和样式复用性的装饰器@Styles和@Extend。@Styles可将多条样式提取为方法,在组件声明处调用,支持静态样式复用;其缺点是仅支持通用属性与事件,且不支持参数。@Extend用于扩展原生组件样式,支持封装私有属性、事件及全局方法,允许传参(包括状态变量和函数)。此外,stateStyles结合@Styles可根据组件状态动态设置样式,增强灵活性。通过实例演示了这些工具在实际开发中的应用,帮助开发者优化样式管理与维护效率。
100 9
|
28天前
|
HarmonyOS:ComposeTitleBar 组件自学指南
本文详解了鸿蒙开发中 ComposeTitleBar 组件的使用方法与技巧,从基础导入到属性配置,再到实际代码示例,帮助开发者构建美观实用的标题栏。组件自 API Version 10 起支持,具备独立功能结构,核心属性包括 `title`(必填)、`subtitle`(可选)和 `menuItems`(右侧菜单列表)。文章通过具体示例展示了如何配置标题、副标题及菜单项,并提供了交互优化、样式定制与多设备适配的建议。掌握这些内容,可显著提升应用界面体验。如果你有所收获,别忘了点赞收藏!
46 8
鸿蒙开发:使用Rect绘制矩形
几何矩形,在实际的开发中,有多种的实现方式,并非一定需要Rect组件,但是,如果有需要用到矩形的场景,建议还是使用Rect组件,因为Rect组件自身携带了很多样式属性,可以满足我们日常的不同的需求。
鸿蒙开发:使用Rect绘制矩形
【04】优雅草星云物联网AI智控系统从0开发鸿蒙端适配-deveco studio-自定义一个设置输入小部件组件-完成所有设置setting相关的页面-优雅草卓伊凡
【04】优雅草星云物联网AI智控系统从0开发鸿蒙端适配-deveco studio-自定义一个设置输入小部件组件-完成所有设置setting相关的页面-优雅草卓伊凡
159 92
【03】优雅草星云物联网AI智控系统从0开发鸿蒙端适配-deveco studio-在lib目录新建自定义库UtilsLibrary,ComponentLibrary,CommonConstLibrary完成设置SettingsView.ets初始公共类书写-优雅草卓伊凡
【03】优雅草星云物联网AI智控系统从0开发鸿蒙端适配-deveco studio-在lib目录新建自定义库UtilsLibrary,ComponentLibrary,CommonConstLibrary完成设置SettingsView.ets初始公共类书写-优雅草卓伊凡
71 23
【03】优雅草星云物联网AI智控系统从0开发鸿蒙端适配-deveco studio-在lib目录新建自定义库UtilsLibrary,ComponentLibrary,CommonConstLibrary完成设置SettingsView.ets初始公共类书写-优雅草卓伊凡
HarmonyOS Next 实战卡片开发 03
本文详细介绍了基于 HarmonyOS Next 的卡片开发实战,涵盖从项目创建到功能实现的全流程。首先通过新建项目和服务卡片搭建基础框架,并设置沉浸式体验优化界面。接着实现了首页轮播图功能,包括申请网络权限、初始化数据和构建轮播组件。随后深入讲解了卡片 id 的处理,涉及获取、返回、持久化存储及移除操作,确保卡片与应用间的高效通信。此外,封装了下载图片工具类,支持卡片发起通知获取网络图片,增强功能扩展性。最后实现了卡片同步轮播功能,使首页与卡片轮播状态保持一致。整个流程注重细节,结合实际案例,为开发者提供了全面的参考。
80 20
HarmonyOS Next 实战卡片开发 03