鸿蒙新特性——Gauge 仪表盘组件详解
一、引言
仪表盘(Gauge)是数据可视化中最具视觉冲击力的组件之一。从汽车仪表盘的速度表到服务器监控面板的 CPU 用量,从智能手表的步数环到工业控制台的温度计——仪表盘将抽象的数值转化为直观的圆弧视觉,让用户一眼识别"当前状态"。
在 HarmonyOS NEXT 之前,开发者要绘制一个圆弧仪表盘,通常需要 Canvas API 手动绘制弧线、刻度、指针,代码动辄上百行。而 ArkUI 在 API 11 中新增了 Gauge 组件,将仪表盘的所有视觉逻辑封装为一个声明式组件:设置数值范围、圆弧角度、线条宽度,就能获得一个完整的仪表盘——无需 Canvas 知识,无需手工数学计算。
本文通过一个设备性能监控面板 Demo 深入讲解 Gauge 组件的核心用法:如何设置量程和圆弧角度?如何用 setInterval 驱动实时数据刷新?如何实现温度预警的视觉反馈?以及如何将多个 Gauge 组合成一个完整的监控看板。
阅读完本文,你将能够:
- 使用 Gauge 组件替代手工绘制的仪表盘
- 用
value/min/max控制量程范围 - 用
startAngle/endAngle自定义圆弧角度 - 用
strokeWidth调整仪表盘线条粗细 - 将 Gauge 融入实时数据监控场景
二、Gauge 组件 API 总览
2.1 构造函数参数
Gauge({ value: 65, min: 0, max: 100 })
| 参数 | 类型 | 说明 |
|---|---|---|
value |
number |
当前指针/填充值,必须在 min 到 max 之间 |
min |
number |
量程最小值,默认为 0 |
max |
number |
量程最大值,默认为 100 |
这三个参数定义了一个 Gauge 的完整量程。value / (max - min) 决定了填充弧线的长度比例。例如 value=65, min=0, max=100 表示仪表盘填充了 65% 的弧线。
当 value 小于 min 时,仪表盘显示为 0% 填充;当 value 大于 max 时,仪表盘显示为 100% 填充——组件会自动裁剪越界值。
2.2 属性方法
startAngle(angle: number)
设置仪表盘弧线的起始角度,单位为度,默认为 240:
Gauge({ value: 65, min: 0, max: 100 })
.startAngle(210) // 从 210°(7 点钟方向)开始
角度以 3 点钟方向为 0°,顺时针增加。startAngle(210) 表示弧线从大约 7 点钟方向(左下)开始。常见的设置:
210:左下角开始,适合仪表盘风格225:左下方更靠下,弧线更短180:正左方开始,对称感强
endAngle(angle: number)
设置仪表盘弧线的终止角度:
.endAngle(150) // 结束于 150°(5 点钟方向)
startAngle(210) 配合 endAngle(150) 形成一个 300° 左右的大弧——这正好占据了圆环的大部分,留下正下方一个 60° 的缺口。这个缺口是仪表盘的"底部",也是放标签文字的理想位置。
角度组合的视觉效果:
| startAngle | endAngle | 弧线范围 | 视觉感觉 |
|---|---|---|---|
| 210 | 150 | ~300° | 大半圆弧,经典仪表盘 |
| 225 | 135 | ~270° | 标准仪表盘,对称 |
| 180 | 180 | ~360° | 完整圆环(几乎闭合) |
strokeWidth(value: Length)
设置仪表盘弧线的线条粗细:
.strokeWidth(14) // 14vp 的弧线宽度
strokeWidth 决定了仪表盘的视觉重量。对于 120×120vp 的 Gauge:
strokeWidth(8-10):细环,精致但不醒目strokeWidth(12-16):中等环,适合大多数场景strokeWidth(18-24):粗环,非常醒目但可能显得笨重
width / height
通过通用属性控制 Gauge 的整体尺寸:
Gauge({ value: 65, min: 0, max: 100 })
.width(120)
.height(120)
Gauge 应在正方形区域内渲染,否则弧线会被拉伸变形。对于监控面板中的仪表盘,推荐尺寸为 100-160vp。
2.3 Gauge 与 Progress(Ring) 的区别
Gauge 和 Progress 的 Ring 类型都展示圆弧进度,但有几个关键区别:
| 特性 | Gauge | Progress(Ring) |
|---|---|---|
| 圆弧角度 | 可自定义 startAngle/endAngle | 固定从 12 点钟顺时针 360° |
| 默认形状 | 大半圆弧(底部有缺口) | 完整圆环 |
| 视觉风格 | 仪表盘风格(粗弧 + 缺口 + 可配指针) | 进度环风格(细环) |
| 适用场景 | 实时读数、仪表盘、监控 | 任务进度、完成率 |
| 最小值 | 可自定义(如 0-120) | 自动从 0 开始 |
选择 Gauge 还是 Progress(Ring) 取决于你要传达的信息类型:
- Gauge:值有"范围"概念(温度 0-120°C、转速 0-8000 RPM)→ 模拟仪表
- Progress(Ring):值有"完成"概念(任务完成 85%、存储用掉 62%)→ 进度指示

三、Demo 设计:设备性能监控面板
3.1 功能概述
Demo 模拟一个设备性能监控面板,展示 4 个系统指标,每个指标对应一个 Gauge 仪表盘:
| 指标 | 量程 | 初始值 | 颜色 | 语义 |
|---|---|---|---|---|
| CPU 使用率 | 0-100 | 42 | #1677FF 蓝 | 计算资源 |
| 内存占用 | 0-100 | 58 | #52C41A 绿 | 存储资源 |
| 磁盘使用 | 0-100 | 35 | #FF9800 橙 | 持久化资源 |
| 温度监测 | 0-120 | 62 | #FF5722 红 | 物理环境 |
4 个 Gauge 以 2×2 网格排列,每行两个。点击"开始监控"按钮后,setInterval 每 1.5 秒随机波动一次,模拟实时数据采集。当温度超过 90°C 时,温度仪表盘边框变红闪烁,产生视觉预警。
点击任一仪表盘弹出详情窗口,显示当前值、峰值和量程范围。
3.2 数据状态与峰值追踪
@State cpuValue: number = 42;
@State cpuPeak: number = 42;
// ... 其他指标类似
@State isMonitoring: boolean = false;
@State tempWarning: boolean = false;
每个指标有两个值:value(当前值)和 peak(历史峰值)。峰值追踪是监控面板的常用功能——用户不仅想知道"现在是多少",还想知道"最严重时到了多少":
// 在监控循环中
let v = this.cpuValue + Math.floor(Math.random() * 17 - 8);
this.cpuValue = Math.max(0, Math.min(100, v));
if (this.cpuValue > this.cpuPeak) {
this.cpuPeak = this.cpuValue; // 更新峰值
}
这里使用 Math.random() * 17 - 8 生成 -8 到 +8 的随机波动,不同指标使用不同的波动幅度——CPU 波动最大(±8),磁盘波动最小(±3),模拟真实场景中不同指标的稳定程度。
3.3 实时监控与定时器驱动
toggleMonitor(): void {
if (this.isMonitoring) {
this.stopAllTimers();
this.isMonitoring = false;
return;
}
this.isMonitoring = true;
this.monitorTimer = setInterval(() => {
// 4 个指标的波动逻辑...
// 温度预警检测...
}, 1500);
}
1500ms 的间隔意味着每秒约 0.67 次更新,这对于监控面板是一个合适的频率——太快会闪烁(且不符合真实采集频率),太慢会让用户觉得数据"停滞"。在实际项目中,监控面板的刷新频率通常在 1-5 秒之间,取决于数据来源的性能。
定时器 ID 存储在 monitorTimer 中,初始值 -1 作为"无活动定时器"的哨兵。aboutToDisappear 中统一清理所有定时器,避免内存泄漏。
3.4 温度预警机制
温度监测是 4 个指标中唯一有"预警"逻辑的——当温度超过 90°C 时触发视觉警报:
if (this.tempValue > 90 && !this.tempWarning) {
this.tempWarning = true;
this.flashTimer = setInterval(() => {
this.tempWarning = !this.tempWarning;
}, 500);
} else if (this.tempValue <= 90 && this.tempWarning) {
this.tempWarning = false;
if (this.flashTimer !== -1) {
clearInterval(this.flashTimer);
this.flashTimer = -1;
}
}
闪烁效果通过一个独立的 500ms 定时器翻转 tempWarning 布尔值实现。在视图中,tempWarning 控制两件事:
- 颜色切换:温度 Gauge 的文字颜色在红色(
#FF1744)和橙红色(#FF5722)之间交替 - 阴影闪烁:通过
.shadow()属性添加/移除红色光晕:
.shadow(this.tempWarning && label === '温度监测'
? { radius: 8, color: '#FF174444' }
: { radius: 0, color: '#00000000' })
这里有一个关键逻辑:闪动仅在 tempValue > 90 时启动一次(条件 !this.tempWarning),避免在每次更新时重复创建定时器。当温度回落到 90 以下时,清理闪烁定时器并恢复 tempWarning = false。
3.5 详情弹窗
点击任一 Gauge 卡片显示详情窗口,包含当前值、峰值和量程范围:
showGaugeDetail(label: string, value: number, peak: number, min: number,
max: number, color: string): void {
this.selectedLabel = label;
this.selectedValue = value;
this.selectedPeak = peak;
this.selectedMin = min;
this.selectedMax = max;
this.selectedColor = color;
this.showDetail = true;
}
弹窗使用 Stack 实现——半透明遮罩层 + 白色内容卡片居中显示。这种自建弹窗方式比系统 AlertDialog 更灵活——可以自定义任何布局,不受系统弹窗的按钮数量限制。
详情展示的 6 个参数由 Gauge 卡片通过闭包传入——这是 onClick 回调与 @Builder 配合的典型模式。由于 ArkTS 的 @Builder 不支持复杂参数传递,在 gaugeCard 的 onClick 中调用组件方法是最自然的方式。
3.6 页面结构
┌──────────────────────────────────────────┐
│ 📊 设备性能监控(深色标题栏) │
├──────────────────────────────────────────┤
│ 📘 Gauge 组件说明卡片 │
├──────────────────────────────────────────┤
│ ┌─────────────────┐┌──────────────────┐ │
│ │ CPU 使用率 ││ 内存占用 │ │
│ │ ┌─────────┐ ││ ┌─────────┐ │ │
│ │ │ 圆弧仪表 │ ││ │ 圆弧仪表 │ │ │
│ │ │ 42% │ ││ │ 58% │ │ │
│ │ └─────────┘ ││ └─────────┘ │ │
│ │ 峰值 42% ││ 峰值 58% │ │
│ └─────────────────┘└──────────────────┘ │
│ ┌─────────────────┐┌──────────────────┐ │
│ │ 磁盘使用 ││ 温度监测 │ │
│ │ ┌─────────┐ ││ ┌─────────┐ │ │
│ │ │ 圆弧仪表 │ ││ │ 圆弧仪表 │ │ │
│ │ │ 35% │ ││ │ 62°C │ │ │
│ │ └─────────┘ ││ └─────────┘ │ │ ← 温度高时红闪
│ │ 峰值 35% ││ 峰值 62°C │ │
│ └─────────────────┘└──────────────────┘ │
├──────────────────────────────────────────┤
│ [▶ 开始监控] [🔄 重置] │
└──────────────────────────────────────────┘
布局由 Scroll 内嵌 Column 组成,4 个 Gauge 卡片通过两个 Row 垂直排列成 2×2 网格。每个卡片宽度 48%(通过 justifyContent: SpaceBetween 分配间距),形成整齐的两列布局。
卡片使用白色背景 + 圆角 + 阴影,与浅灰色页面背景(#F2F3F5)形成分层感。Gauge 组件的值文字(如 42%)使用与指标语义对应的颜色——蓝色(CPU)、绿色(内存)、橙色(磁盘)、红色(温度)。
四、Gauge 组件的最佳实践
4.1 量程设计
量程(min 和 max)的设计应遵循"语义优先"原则:
- 百分比类指标(CPU、内存、磁盘):
min=0, max=100。这是最自然的量程——100 就是"满"。 - 物理量指标(温度、速度、电压):
min和max应设置为"有意义的范围"。例如温度min=0, max=120——0°C 是水结冰的参考点,120°C 是大多数电子设备的极限温度。不要设为max=500,因为超出有意义范围的刻度是浪费的视觉效果。 - 不对称量程:例如 CPU 温度可以设为
min=30(室温)和max=100(降频阈值),而不是从 0 开始。这样可以更精细地展示"有意义区间"内的变化。
4.2 角度设计
startAngle 和 endAngle 决定了仪表盘的视觉"开口",不同的角度组合传达不同的心理感受:
- 210° - 150°(~300° 弧):经典仪表盘,弧线从 7 点钟到 5 点钟。底部有一个自然的缺口,适合放数值标签。这是大多数场景的首选。
- 225° - 135°(~270° 弧):更紧凑的仪表盘,视觉中心感更强。适合小尺寸(80×80vp 或更小)。
- 240° - 120°(~240° 弧):非常紧凑,适合超小尺寸(60×60vp)。
弧线范围不要小于 180°,否则 Gauge 看起来不像是"圆盘"而像是"半圆弧"——失去了仪表盘的模拟感。
4.3 颜色策略
Gauge 没有 color 属性——它的填充色使用默认主题色。但可以通过以下几种方式影响视觉效果:
- 外层的文字颜色:在 Gauge 上方/下方显示数值时使用与指标语义对应的颜色(蓝=正常、橙=警告、红=危险)
- 背景色对比:Gauge 卡片使用白色背景,让深色弧线更加突出
- 阴影:预警场景使用彩色阴影(如红色光晕)增强视觉张力
颜色应与指标的"重要性"层级对应:
- 一级指标(CPU、温度):使用蓝色和红/橙色 → 最需关注
- 二级指标(内存、磁盘):使用绿色和橙色 → 常态关注
不要用黄色做 Gauge 数值的颜色——黄色在浅色背景上对比度不足,难以阅读。
4.4 尺寸与布局
Gauge 的尺寸由 width 和 height 决定,应在正方形区域内渲染:
| 屏幕布局 | 推荐 Gauge 尺寸 | 理由 |
|---|---|---|
| 单列(1 个大仪表盘) | 160-200vp | 视觉焦点,需要大尺寸 |
| 双列(2×2 网格) | 100-140vp | 平衡信息密度和可读性 |
| 三列(3 个指标) | 80-100vp | 信息密度高,适合次级指标 |
本 Demo 使用 120×120vp(双列布局),在 360vp 宽度的手机屏幕上,每列约 48% 宽度(约 173vp),Gauge 的 120vp 在卡片中有足够的留白。
4.5 数据更新频率
实时监控的核心矛盾是:更新太快 → 闪烁且消耗性能;更新太慢 → 数据失去"实时"感。推荐的更新频率:
| 场景 | 更新间隔 | 理由 |
|---|---|---|
| 系统性能监控 | 1-3 秒 | 系统指标波动频繁,1-3 秒能感知变化 |
| 环境传感器(温度/湿度) | 3-5 秒 | 环境变化缓慢,无需高频 |
| 网络流量 | 1-2 秒 | 网络波动需要较快响应 |
| 模拟/演示 | 1.5-2 秒 | 既不闪烁又能展示动态效果 |
本 Demo 使用 1500ms(1.5 秒),在 4 个指标同时波动时,每个指标有足够的时间展示变化,用户不会觉得"变化太快来不及看"。
五、完整代码结构
GaugePage (~230 行)
├── 状态变量
│ ├── cpuValue/cpuPeak — CPU 使用率 + 峰值
│ ├── memValue/memPeak — 内存占用 + 峰值
│ ├── diskValue/diskPeak — 磁盘使用 + 峰值
│ ├── tempValue/tempPeak — 温度 + 峰值
│ ├── isMonitoring — 是否正在监控
│ └── tempWarning — 温度预警闪烁
├── 生命周期
│ └── aboutToDisappear() → stopAllTimers()
├── 业务逻辑
│ ├── toggleMonitor() — 开始/停止实时监控
│ ├── resetAll() — 清空所有数据
│ ├── showGaugeDetail() — 打开详情弹窗
│ └── stopAllTimers() — 清理所有定时器
├── 视图
│ ├── 标题栏 — 📊 设备性能监控
│ ├── 说明卡片 — Gauge 组件介绍
│ ├── Row 1: CPU Gauge + 内存 Gauge
│ ├── Row 2: 磁盘 Gauge + 温度 Gauge
│ ├── 控制按钮行: 开始/停止 + 重置
│ └── 详情弹窗(Stack 叠加)
└── @Builder gaugeCard() — 可复用的 Gauge 卡片
├── Gauge 组件(startAngle:210 / endAngle:150 / strokeWidth:14)
├── 当前值文字
├── 峰值文字
└── onClick → showGaugeDetail()
六、总结
本文通过一个设备性能监控面板 Demo 深入讲解了 HarmonyOS NEXT 中的 Gauge 仪表盘组件。Gauge 将传统的手工 Canvas 圆弧绘制逻辑封装为声明式组件,通过 value/min/max 控制量程,通过 startAngle/endAngle 自定义圆弧角度,通过 strokeWidth 调整线条粗细。
核心要点回顾:
-
Gauge 的量程设计:
min和max决定了仪表盘的数值范围。百分比类指标用 0-100,物理量指标用有意义的范围(如温度 0-120)。量程设计直接影响仪表盘的"读数密度"。 -
圆弧角度控制:
startAngle和endAngle决定了仪表盘的开口位置和弧线长度。210°-150° 形成约 300° 的经典仪表盘弧线——角度组合是 Gauge 区别于 Progress(Ring) 的核心特性。 -
Gauge vs Progress(Ring):Gauge 是为"模拟读数"设计的——有角度、有范围、有缺口。Progress(Ring) 是为"完成比例"设计的——360° 完整圆环,从 0 到 100%。选择哪个取决于你要传达"读数感"还是"完成感"。
-
实时数据监控:
setInterval驱动数据波动,每个指标有独立的波动幅度(CPU ±8、磁盘 ±3)。峰值追踪(peak)记录了"最严重的时刻",这在真实监控中是一个重要信息维度。 -
预警机制:温度超过阈值时触发视觉预警——文字颜色在红色/橙红之间闪烁 + 卡片阴影添加红色光晕。闪烁通过独立的
setInterval(500ms)翻转布尔值实现,阈值检测避免重复创建定时器。 -
定时器管理:所有定时器 ID 用
-1哨兵标记"无活动"状态,aboutToDisappear中统一清理。这是 ArkUI 定时器的标准管理模式——组件销毁时定时器必须清理,否则导致无效更新和内存泄漏。
Gauge 组件是 HarmonyOS NEXT 面向物联网和数据可视化场景的重要工具。在智能家居、工业控制、设备管理、健康监测等应用中,仪表盘是最自然的数值展示方式——Gauge 让开发者从 Canvas 数学计算中解放出来,专注于"展示什么数据"而非"怎么画弧线"。这正是 ArkUI 声明式组件体系的核心价值——用组件替代手工,用声明替代计算。
七、扩展思考
Gauge 组件当前的功能已经覆盖了仪表盘的核心需求,但在实际项目中,你可能还会遇到以下进阶场景:
多色分段:仪表盘不同区段使用不同颜色——例如 0-60% 绿色,60-80% 黄色,80-100% 红色。这需要 colors 属性(或类似的多色分段 API),但目前该 API 在不同 ArkUI 版本中表现不一致。在 colors 稳定之前,可以用多个不同颜色的 Gauge 叠放或在外层用彩色文字/标签区别区段。
指针动画:数值变化时指针平滑移动而非跳变。可以通过 animateTo 包裹 value 的变化来实现过渡动画——但需要注意的是,animateTo 对 number 类型属性生效的前提是组件在动画过程中持续重绘。
自定义指针:将默认的实心弧线末端替换为圆形指针或箭头。这需要更底层的 Canvas 自定义——Gauge 的默认样式足以满足大多数场景,而极端定制需求可能需要完全自绘。
多仪表盘联动:例如"当 CPU 超过 90% 时自动展开温度仪表盘"。这在智能家居/物联网场景中很常见——不同指标之间存在因果关系。实现方式是在单个 setInterval 循环中检查多个指标的关联逻辑,这与 Gauge 组件本身无关,而是业务层的编排。
这些扩展场景说明:Gauge 是一个"核心足够好"的基础组件——它解决了 80% 的仪表盘需求,对于剩下的 20%,可以基于 Gauge 定制或使用 Canvas 自绘。理解 Gauge 的核心机制(量程、角度、宽度)是处理所有仪表盘需求的基础。
更多推荐




所有评论(0)