news 2026/7/19 3:09:44

HarmonyOS ArkUI Slider 与 Rating 实战:音量控制、亮度调节与星级评分

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HarmonyOS ArkUI Slider 与 Rating 实战:音量控制、亮度调节与星级评分

系列:鸿蒙 HarmonyOS 6.1 新特性实战 · 第 35 篇

Slider(滑块)和 Rating(评分)是两个高频使用的数值选择组件。Slider 适合连续值(音量、亮度、进度),Rating 适合离散评分(1-5 星)。本篇涵盖 OutSet/InSet 两种 Slider 样式、垂直方向、提示气泡和 Rating 的 0.5 步进评分。

运行效果

初始状态,展示各种 Slider 和 Rating:

拖动音量 Slider 后的状态:

一、Slider 基础用法

@State volume: number = 60 Slider({ value: this.volume, min: 0, max: 100, step: 1, style: SliderStyle.OutSet // 滑块在轨道外侧 }) .width('100%') .selectedColor('#0066ff') .trackColor('#e0e0e0') .trackThickness(4) .showTips(true) // 拖动时显示数值气泡 .onChange((val: number) => { this.volume = Math.round(val) })

OutSet vs InSet

// OutSet(默认):滑块突出轨道,视觉更明显 Slider({ style: SliderStyle.OutSet, ... }) // InSet:滑块内嵌轨道,更紧凑 Slider({ style: SliderStyle.InSet, ... })

二、垂直 Slider

@State brightnessVal: number = 80 Slider({ value: this.brightnessVal, min: 0, max: 100, step: 1, style: SliderStyle.OutSet, direction: Axis.Vertical, // 垂直方向 reverse: false // false=从下到上增加(亮度/音量的直觉方向) }) .height(200) .selectedColor('#f39c12') .onChange((val: number) => { this.brightnessVal = Math.round(val) })

注意@State属性名不能叫brightness,这与 ArkUI 的内置.brightness()方法同名会引发类型冲突,应命名为brightnessVal等。

三、showTips 提示气泡

Slider({ value: this.progress, ... }) .showTips(true) // 拖动时在滑块上方显示当前值

气泡会自动格式化显示数值,适合需要精确数值反馈的场景(音量、进度条等)。

四、Rating 评分组件

@State starScore: number = 3.5 @State readonlyScore: number = 4.0 // 可交互评分(0.5 步进) Rating({ rating: this.starScore, indicator: false }) .stars(5) .stepSize(0.5) // 每次调整 0.5 颗星 .starStyle({ backgroundUri: 'common/star_off.svg', foregroundUri: 'common/star_on.svg', }) .onChange((val: number) => { this.starScore = val }) // 只读指示器(用于展示评分) Rating({ rating: this.readonlyScore, indicator: true }) .stars(5)

indicator: true时用户无法修改,适合评论列表展示场景。

完整代码

@Entry @Component struct Index { @State volume: number = 60 @State brightnessVal: number = 80 @State progress: number = 45 @State starScore: number = 3.5 @State readonlyScore: number = 4.0 build() { Scroll() { Column({ space: 20 }) { Text('Slider 与 Rating 完全指南') .fontSize(22).fontWeight(FontWeight.Bold).fontColor('#1a1a1a') // 1. OutSet 水平 Slider(音量) Column({ space: 10 }) { Text('一、Slider OutSet(水平)').fontSize(15).fontWeight(FontWeight.Bold).fontColor('#333') Row({ space: 12 }) { Text('🔊').fontSize(20) Slider({ value: this.volume, min: 0, max: 100, step: 1, style: SliderStyle.OutSet }) .layoutWeight(1).selectedColor('#0066ff').trackColor('#e0e0e0') .trackThickness(4).showTips(true) .onChange((val: number) => { this.volume = Math.round(val) }) Text(this.volume.toString() + '%').fontSize(13).fontColor('#555').width(40) } .alignItems(VerticalAlign.Center).width('100%') } .padding(12).backgroundColor('#fff').borderRadius(8).width('100%') .border({ width: 1, color: '#e0e0e0' }).alignItems(HorizontalAlign.Start) // 2. InSet 样式 Column({ space: 10 }) { Text('二、Slider InSet(进度)').fontSize(15).fontWeight(FontWeight.Bold).fontColor('#333') Slider({ value: this.progress, min: 0, max: 100, step: 5, style: SliderStyle.InSet }) .width('100%').selectedColor('#27ae60').trackColor('#e0e0e0') .trackThickness(8).showTips(true) .onChange((val: number) => { this.progress = Math.round(val) }) Text('进度:' + this.progress.toString() + '%') .fontSize(13).fontColor('#27ae60').fontWeight(FontWeight.Bold) } .padding(12).backgroundColor('#fff').borderRadius(8).width('100%') .border({ width: 1, color: '#e0e0e0' }).alignItems(HorizontalAlign.Start) // 3. 垂直 Slider(亮度) Column({ space: 10 }) { Text('三、Slider 垂直(亮度)').fontSize(15).fontWeight(FontWeight.Bold).fontColor('#333') Row({ space: 20 }) { Slider({ value: this.brightnessVal, min: 0, max: 100, step: 1, style: SliderStyle.OutSet, direction: Axis.Vertical, reverse: false }) .height(160).selectedColor('#f39c12').trackColor('#e0e0e0').trackThickness(4) .onChange((val: number) => { this.brightnessVal = Math.round(val) }) Column({ space: 8 }) { Text('☀️').fontSize(32) Text(this.brightnessVal.toString() + '%').fontSize(14).fontColor('#f39c12').fontWeight(FontWeight.Bold) Text('亮度').fontSize(12).fontColor('#888') } } .alignItems(VerticalAlign.Center) } .padding(12).backgroundColor('#fff').borderRadius(8).width('100%') .border({ width: 1, color: '#e0e0e0' }).alignItems(HorizontalAlign.Start) // 4. Rating Column({ space: 10 }) { Text('四、Rating 星级评分').fontSize(15).fontWeight(FontWeight.Bold).fontColor('#333') Text('可交互(0.5 步进):').fontSize(13).fontColor('#555') Row({ space: 12 }) { Rating({ rating: this.starScore, indicator: false }) .stars(5).stepSize(0.5) .onChange((val: number) => { this.starScore = val }) Text(this.starScore.toFixed(1) + ' ★').fontSize(14).fontColor('#f39c12').fontWeight(FontWeight.Bold) } .alignItems(VerticalAlign.Center) Text('只读展示(indicator=true):').fontSize(13).fontColor('#555') Row({ space: 12 }) { Rating({ rating: this.readonlyScore, indicator: true }) .stars(5) Text(this.readonlyScore.toFixed(1) + ' / 5.0').fontSize(13).fontColor('#888') } .alignItems(VerticalAlign.Center) } .padding(12).backgroundColor('#fff').borderRadius(8).width('100%') .border({ width: 1, color: '#e0e0e0' }).alignItems(HorizontalAlign.Start) } .padding(20).width('100%') } .width('100%').height('100%').backgroundColor('#f5f5f5') } }

API 速查

属性/方法说明
Slider({ value, min, max, step, style, direction })创建滑块
.selectedColor('#0066ff')已选轨道颜色
.trackColor('#e0e0e0')未选轨道颜色
.trackThickness(4)轨道粗细
.showTips(true)拖动时显示数值气泡
SliderStyle.OutSet / InSet外突 / 内嵌样式
Axis.Vertical / Horizontal滑动方向
Rating({ rating, indicator })创建评分组件
.stars(5)总星数
.stepSize(0.5)最小步进值

小结

  • @State属性避开 ArkUI 内置名brightnessopacityscale等与 ArkUI 方法同名,会引发类型冲突
  • showTips适合精确值反馈:音量、进度等场景开启,告知用户当前精确数值
  • 垂直 Slider 要设高度:水平设width,垂直设height
  • Ratingindicator=true只读:评论列表展示用只读模式,防止误操作

上一篇:Checkbox、Radio、Toggle 选择组件实战 | 下一篇:Progress 进度条:5 种类型与动画演示

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/19 3:09:12

嵌入式固件开发核心技术与实践指南

1. 实验背景与固件程序概述这个实验项目来自计算机相关专业的课程实践,涉及20175307、20175308、20175319三位同学合作完成的固件程序设计。固件作为硬件与软件之间的桥梁,在嵌入式系统和物联网设备中扮演着关键角色。不同于普通应用程序,固件…

作者头像 李华
网站建设 2026/7/19 3:08:55

TeX Live 安装报错:为什么修改 TEMP 和 TMP 后就能正常安装?

一、问题背景 在 Windows 系统中安装 TeX Live 2026 时,我最开始将 TeX Live 安装到: D:\latex但是安装过程中仍然出现了下面的错误: open(>C:\Users\D\x{00a1}\x{00c7}\x{00c7}\AppData\Local\Temp\ jAwfJF6xdB\XJVidyEL9z\a2ping.window…

作者头像 李华
网站建设 2026/7/19 3:08:47

C#开发PC-DMIS文件解析与自动化测量

1. PC-DMIS文件解析需求背景PC-DMIS作为工业测量领域的专业软件,其生成的.prg程序文件包含了三坐标测量机的完整检测逻辑。在智能制造场景中,企业常需要将这些测量程序集成到MES系统或质量分析平台中。通过C#进行二次开发可以实现:测量结果的…

作者头像 李华
网站建设 2026/7/19 3:08:45

GPT-5.6 Sol:多模态大模型在数学推理与视觉理解的技术突破

这次我们来关注一个近期在技术社区引发热议的话题——GPT-5.6 Sol。从名称上看,这似乎是OpenAI GPT系列的一个新版本,特别强调了其在数学(Sol)和视觉能力方面的突破。不过需要明确的是,目前OpenAI官方并未发布名为&quo…

作者头像 李华
网站建设 2026/7/19 3:08:19

【无标题】vmware虚拟机无法勾选**将主机虚拟适配器连接到此网络** /没有网络(不显示网络图标)的解决方法

先使用ccleaner修复无法勾选将主机虚拟适配器连接到此网络但是虚拟机无法显示网络图标,如下操作后修复。 虚拟机终端执行命令 # 只删除状态文件不会删除已保存的 WiFi 密码、有线配置,只会重置服务运行状态,不会丢失网络配置。 # 停止系统自带…

作者头像 李华
网站建设 2026/7/19 3:08:03

LLM交互设计:从提示词工程到认知对齐的实战方法论

1. 这不是“调用API”——而是重建人与智能体的对话契约“Mastering LLM Interactions”这个标题,乍看像一本技术手册的副标题,但在我过去三年带团队落地27个LLM应用项目、亲手打磨过412版提示词、在客服、法务、教育、医疗四个强约束场景反复踩坑之后&a…

作者头像 李华