一、引言

仪表盘(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 当前指针/填充值,必须在 minmax 之间
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 控制两件事:

  1. 颜色切换:温度 Gauge 的文字颜色在红色(#FF1744)和橙红色(#FF5722)之间交替
  2. 阴影闪烁:通过 .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 不支持复杂参数传递,在 gaugeCardonClick 中调用组件方法是最自然的方式。

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 量程设计

量程(minmax)的设计应遵循"语义优先"原则:

  • 百分比类指标(CPU、内存、磁盘):min=0, max=100。这是最自然的量程——100 就是"满"。
  • 物理量指标(温度、速度、电压):minmax 应设置为"有意义的范围"。例如温度 min=0, max=120——0°C 是水结冰的参考点,120°C 是大多数电子设备的极限温度。不要设为 max=500,因为超出有意义范围的刻度是浪费的视觉效果。
  • 不对称量程:例如 CPU 温度可以设为 min=30(室温)和 max=100(降频阈值),而不是从 0 开始。这样可以更精细地展示"有意义区间"内的变化。

4.2 角度设计

startAngleendAngle 决定了仪表盘的视觉"开口",不同的角度组合传达不同的心理感受:

  • 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 的尺寸由 widthheight 决定,应在正方形区域内渲染:

屏幕布局 推荐 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 调整线条粗细。

核心要点回顾:

  1. Gauge 的量程设计minmax 决定了仪表盘的数值范围。百分比类指标用 0-100,物理量指标用有意义的范围(如温度 0-120)。量程设计直接影响仪表盘的"读数密度"。

  2. 圆弧角度控制startAngleendAngle 决定了仪表盘的开口位置和弧线长度。210°-150° 形成约 300° 的经典仪表盘弧线——角度组合是 Gauge 区别于 Progress(Ring) 的核心特性。

  3. Gauge vs Progress(Ring):Gauge 是为"模拟读数"设计的——有角度、有范围、有缺口。Progress(Ring) 是为"完成比例"设计的——360° 完整圆环,从 0 到 100%。选择哪个取决于你要传达"读数感"还是"完成感"。

  4. 实时数据监控setInterval 驱动数据波动,每个指标有独立的波动幅度(CPU ±8、磁盘 ±3)。峰值追踪(peak)记录了"最严重的时刻",这在真实监控中是一个重要信息维度。

  5. 预警机制:温度超过阈值时触发视觉预警——文字颜色在红色/橙红之间闪烁 + 卡片阴影添加红色光晕。闪烁通过独立的 setInterval(500ms)翻转布尔值实现,阈值检测避免重复创建定时器。

  6. 定时器管理:所有定时器 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 的核心机制(量程、角度、宽度)是处理所有仪表盘需求的基础。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐