mirror of
https://github.com/AtomUI/AtomUI.git
synced 2026-10-19 06:58:57 +08:00
11 KiB
11 KiB
ProgressBar 进度条
概述
进度条(ProgressBar)用于展示操作的当前进度和状态,将抽象的进度数值转化为直观的视觉反馈。AtomUI 提供四种进度条变体,覆盖不同的使用场景:
| 控件 | 说明 | 适用场景 |
|---|---|---|
ProgressBar |
线形进度条(水平/垂直) | 文件上传、表单提交、批量操作等通用场景 |
CircleProgress |
圆形进度条 | 仪表板卡片、统计展示、紧凑空间 |
DashboardProgress |
仪表盘进度条(可设置缺口) | 仪表盘面板、数据可视化 |
StepsProgressBar |
步骤进度条(分段块状) | 步骤流程、分阶段任务进度 |
AtomUI 的进度条控件完整复刻了 Ant Design 5.0 Progress 的设计规范。
设计原理
Ant Design 的进度条设计哲学
Ant Design 对进度条的设计遵循三个核心原则:
- 状态可视化 — 将抽象的进度数值转化为直观的视觉反馈,用户无需阅读具体数字即可感知任务完成程度
- 多种形态 — 线形(Line)、圆形(Circle)、仪表盘(Dashboard)、步骤(Steps)满足不同场景的空间和语义需求
- 状态语义 — 通过颜色传达 Normal(蓝色/默认)、Success(绿色/完成)、Exception(红色/异常)、Active(动画/进行中)四种语义
四种状态:
| 状态 | 颜色语义 | 说明 |
|---|---|---|
Normal |
主色(ColorInfo) |
默认进行中状态 |
Success |
成功色(ColorSuccess) |
任务完成,自动在 Value == Maximum 时触发 |
Exception |
错误色(ColorError) |
任务异常/失败 |
Active |
主色 + 动画 | 活跃进行中(线形进度条专属) |
Avalonia RangeBase 基础能力
所有进度条控件最终继承自 Avalonia 的 RangeBase,它提供了 Value、Minimum、Maximum 三个核心属性来定义值域范围。
RangeBase 提供的基础属性:
| 属性 | 说明 |
|---|---|
Value |
当前进度值 |
Minimum |
最小值(默认 0) |
Maximum |
最大值(默认 100) |
AtomUI 的分层扩展设计
AtomUI 的进度条采用了精心设计的多层抽象继承体系,确保代码最大化复用:
| 扩展能力 | 实现方式 | 设计动机 |
|---|---|---|
| 多种形态 | 4 个独立控件类 | 线形/圆形/仪表盘/步骤各有独立模板 |
| 水平/垂直方向 | Orientation 属性 |
线形和步骤进度条支持两个方向 |
| 进度文字 | IsShowProgressInfo + ProgressTextFormat |
可定制进度百分比文字格式 |
| 百分比位置 | PercentPosition 结构体 |
文字可在进度条外侧(Start/Center/End)或内部 |
| 状态 | Status 枚举 |
Normal/Success/Exception/Active 语义化颜色 |
| 成功阈值 | SuccessThreshold + SuccessStrokeBrush |
达到阈值后部分区域使用成功色 |
| 不定态 | IsIndeterminate |
无法确定进度时的动画反馈 |
| 自定义线宽 | IndicatorThickness |
自定义进度条粗细 |
| 端点样式 | StrokeLineCap (Round/Flat/Square) |
圆角/方角端点 |
| 三种尺寸 | ISizeTypeAware |
Large/Middle/Small 自动计算线宽 |
| 步进段 | StepCount + StepGap |
圆形/仪表盘支持分段显示 |
| 自定义颜色 | StrokeBrush + TrailColor |
支持纯色和渐变画刷 |
| Design Token | ProgressBarToken |
所有视觉值从 Token 派生 |
与 Ant Design 规范的对齐程度
| 特性 | Ant Design (React) | AtomUI (Avalonia) | 对齐情况 |
|---|---|---|---|
线形 type="line" |
✅ | ✅ ProgressBar |
✅ 完全对齐 |
圆形 type="circle" |
✅ | ✅ CircleProgress |
✅ 完全对齐 |
仪表盘 type="dashboard" |
✅ | ✅ DashboardProgress |
✅ 完全对齐 |
步骤 steps |
✅ | ✅ StepsProgressBar |
✅ 完全对齐 |
百分比 percent |
✅ | ✅ Value (0–100) |
✅ 完全对齐 |
状态 status |
✅ normal/success/exception/active | ✅ Status 枚举 |
✅ 完全对齐 |
描边颜色 strokeColor |
✅ 支持渐变 | ✅ StrokeBrush(支持 IBrush) |
✅ 完全对齐 |
轨道颜色 trailColor |
✅ | ✅ TrailColor |
✅ 完全对齐 |
线帽 strokeLinecap |
✅ round/butt | ✅ StrokeLineCap |
✅ 完全对齐 |
进度信息 showInfo |
✅ | ✅ IsShowProgressInfo |
✅ 完全对齐 |
进度格式 format |
✅ 函数 | ✅ ProgressTextFormat(格式字符串) |
⚠️ 格式字符串替代函数 |
进度条粗细 strokeWidth |
✅ | ✅ IndicatorThickness |
✅ 完全对齐 |
百分比位置 percentPosition |
✅ 5.18.0+ | ✅ PercentPosition 结构体 |
✅ 完全对齐 |
成功段 success.percent |
✅ | ✅ SuccessThreshold + SuccessStrokeBrush |
✅ 完全对齐 |
缺口位置 gapPosition |
✅ | ✅ DashboardGapPosition |
✅ 完全对齐 |
缺口角度 gapDegree |
✅ | ✅ GapDegree |
✅ 完全对齐 |
三种尺寸 size |
✅ | ✅ SizeType |
✅ 完全对齐 |
步骤数 steps |
✅ | ✅ Steps / StepCount |
✅ 完全对齐 |
| 方向 | ❌ 仅水平 | ✅ Orientation(水平+垂直) |
🔥 AtomUI 额外支持 |
继承关系
核心继承链
Avalonia.Controls.Primitives.RangeBase
└── AtomUI.Controls.Commons.AbstractProgressBar (ISizeTypeAware, IMotionAwareControl)
├── AtomUI.Controls.Commons.AbstractLineProgress
│ ├── AtomUI.Controls.Commons.AbstractGeneralProgressBar
│ │ └── AtomUI.Desktop.Controls.ProgressBar ← 线形进度条
│ └── AtomUI.Controls.Commons.AbstractGeneralStepsProgressBar
│ └── AtomUI.Desktop.Controls.StepsProgressBar ← 步骤进度条
└── AtomUI.Controls.Commons.AbstractCircleProgress
├── AtomUI.Controls.Commons.AbstractGeneralCircleProgress
│ └── AtomUI.Desktop.Controls.CircleProgress ← 圆形进度条
└── AtomUI.Controls.Commons.AbstractGeneralDashboardProgress
└── AtomUI.Desktop.Controls.DashboardProgress ← 仪表盘进度条
各层级职责划分
| 层级 | 提供的能力 |
|---|---|
RangeBase (Avalonia) |
Value / Minimum / Maximum 值域管理 |
AbstractProgressBar |
通用进度逻辑:百分比计算、状态管理、进度文字、尺寸感知、描边颜色、轨道颜色、线帽、伪类、过渡动画 |
AbstractLineProgress |
线形方向(Orientation)、水平/垂直伪类、尺寸阈值计算、默认图标(CloseCircleFilled/CheckCircleFilled) |
AbstractCircleProgress |
圆形尺寸计算、步进段(StepCount/StepGap)、自适应字体/图标大小、默认图标(CloseOutlined/CheckOutlined) |
AbstractGeneralProgressBar |
线形渲染(凹槽+指示器)、百分比位置(PercentPosition)、内外标签布局、成功阈值渲染 |
AbstractGeneralCircleProgress |
圆形渲染(椭圆/弧线)、步进段渲染、角度计算 |
AbstractGeneralDashboardProgress |
仪表盘渲染(带缺口弧线)、DashboardGapPosition + GapDegree |
AbstractGeneralStepsProgressBar |
步骤块渲染、Steps/ChunkWidth/ChunkHeight、分段着色 |
桌面具体类 (ProgressBar 等) |
仅注册 ProgressBarToken.ScopeProvider Token 作用域 |
实现的共享接口
| 接口 | 定义位置 | 作用 |
|---|---|---|
ISizeTypeAware |
AtomUI.Controls.Shared |
支持 SizeType(Small / Middle / Large)三种尺寸,自动调整线宽 |
IMotionAwareControl |
AtomUI.Controls.Shared |
支持进度值过渡动画、颜色渐变动画 |
源码位置
设备无关层(AtomUI.Controls)
| 文件路径 | 说明 |
|---|---|
src/AtomUI.Controls/ProgressBar/AbstractProgressBar.cs |
所有进度条的抽象基类 |
src/AtomUI.Controls/ProgressBar/AbstractLineProgress.cs |
线形进度条抽象基类(水平/垂直) |
src/AtomUI.Controls/ProgressBar/AbstractGeneralProgressBar.cs |
通用线形进度条(含渲染) |
src/AtomUI.Controls/ProgressBar/AbstractCircleProgress.cs |
圆形进度条抽象基类 |
src/AtomUI.Controls/ProgressBar/AbstractGeneralCircleProgress.cs |
通用圆形进度条(含渲染) |
src/AtomUI.Controls/ProgressBar/AbstractGeneralDashboardProgress.cs |
仪表盘进度条(含渲染) |
src/AtomUI.Controls/ProgressBar/AbstractGeneralStepsProgressBar.cs |
步骤进度条(含渲染) |
src/AtomUI.Controls/ProgressBar/ProgressBarEnums.cs |
枚举定义(ProgressStatus 等) |
src/AtomUI.Controls/ProgressBar/ProgressBarPseudoClass.cs |
伪类常量 |
桌面平台层(AtomUI.Desktop.Controls)
| 文件路径 | 说明 |
|---|---|
src/AtomUI.Desktop.Controls/ProgressBar/ProgressBar.cs |
线形进度条 |
src/AtomUI.Desktop.Controls/ProgressBar/CircleProgress.cs |
圆形进度条 |
src/AtomUI.Desktop.Controls/ProgressBar/DashboardProgress.cs |
仪表盘进度条 |
src/AtomUI.Desktop.Controls/ProgressBar/StepsProgressBar.cs |
步骤进度条 |
src/AtomUI.Desktop.Controls/ProgressBar/ProgressBarToken.cs |
组件级 Design Token |
src/AtomUI.Desktop.Controls/ProgressBar/Themes/ |
ControlTheme 文件 |
| Gallery 示例 | controlgallery/AtomUIGallery/ShowCases/Views/Feedback/ProgressBarShowCase.axaml |
渲染机制
所有进度条都采用 自定义渲染(override Render)而非模板内控件组合,直接使用 DrawingContext 绘制凹槽(Groove)和指示器(Indicator)。这种设计的优势:
- 性能优秀:无需额外的可视化树节点
- 精确控制:端点圆角、弧线角度等视觉细节可像素级控制
- 渐变支持:
StrokeBrush支持LinearGradientBrush等复杂画刷
线形进度条渲染流程
- 计算凹槽矩形(
_grooveRect),考虑百分比标签位置的偏移 - 使用
GrooveBrush绘制凹槽背景(Round → 胶囊形,Flat → 矩形) - 根据
Percentage计算指示器矩形(从凹槽右侧/底部缩进) - 使用
StrokeBrush绘制指示器 - 如有
SuccessThreshold,再叠加绘制成功阈值段
圆形/仪表盘渲染流程
- 计算圆形区域(正方形),使用
DrawEllipse或DrawArc绘制凹槽环 - 根据
IndicatorAngle使用DrawArc绘制指示器弧线 - 如有
StepCount,将圆环分段绘制
完成/异常图标
当进度达到 Maximum 或 Status == Exception 时,百分比文字会替换为图标:
| 进度条类型 | 完成图标 | 异常图标 |
|---|---|---|
| 线形 / 步骤 | CheckCircleFilled ✅ |
CloseCircleFilled ❌ |
| 圆形 / 仪表盘 | CheckOutlined ✓ |
CloseOutlined ✗ |