目录
项目概述


项目背景
在HarmonyOS应用开发中,进度条是常见的UI组件,用于展示任务进度、加载状态等信息。本项目基于Qt/QML框架,开发了四种风格的水平进度条组件,包括动画进度条、渐变进度条、呼吸进度条和垂直末端进度条,为HarmonyOS应用提供丰富的进度展示方案。
组件特性
本项目实现了以下四种水平进度条组件:
- ✅ 动画进度条(AnimatedProgressBar):带有流动动画效果的渐变进度条
- ✅ 渐变进度条(GradientProgressBar):静态的水平渐变进度条
- ✅ 呼吸进度条(BreathingProgressBar):带有透明度呼吸动画效果的进度条
- ✅ 垂直末端进度条(VerticalEndProgressBar):右侧带有圆形末端的特殊进度条
所有组件均支持:
- 自定义进度值(value、minimum、maximum)
- 自定义颜色(起始色、结束色、背景色)
- 圆角设计
- 响应式布局
技术栈选择
前端框架:Qt/QML
选择理由:
- 声明式UI:QML的声明式语法使得UI开发更加直观和高效
- 性能优势:Qt的渲染引擎基于OpenGL ES,性能优异
- Canvas绘制:支持自定义2D绘制,实现复杂的渐变和动画效果
- 动画支持:内置强大的动画系统,支持属性动画和序列动画
核心技术点
- QtQuick 2.15:UI框架
- Canvas API:自定义绘制渐变和圆角
- PropertyAnimation:属性动画
- SequentialAnimation:序列动画
组件设计
整体架构
所有进度条组件都遵循统一的设计模式:
Item (root)
├── Rectangle (background) - 背景层
└── Rectangle/Item (progressBar) - 进度层
└── Canvas/Gradient - 渐变绘制
统一属性接口
所有组件都实现了以下标准属性:
qml
property real value: 0 // 当前值
property real minimum: 0 // 最小值
property real maximum: 100 // 最大值
property real progress: ... // 计算得出的进度比例(0-1)
property color startColor // 起始颜色
property color endColor // 结束颜色
property color backgroundColor // 背景颜色
property real backgroundOpacity // 背景透明度
核心功能实现
1. 动画进度条(AnimatedProgressBar)
功能特点:
- 使用Canvas绘制水平渐变
- 通过
animationOffset属性实现流动动画效果 - 渐变颜色停止点随动画偏移动态变化
实现原理:
qml
// 定义动画偏移属性
property real animationOffset: 0
// 序列动画:0 -> 1 -> 0 循环
SequentialAnimation on animationOffset {
running: true
loops: Animation.Infinite
NumberAnimation {
from: 0
to: 1
duration: 2000
easing.type: Easing.InOutQuad
}
NumberAnimation {
from: 1
to: 0
duration: 2000
easing.type: Easing.InOutQuad
}
}
// Canvas绘制渐变
Canvas {
onPaint: {
var gradient = ctx.createLinearGradient(0, 0, width, 0);
gradient.addColorStop(0, startColor);
gradient.addColorStop(animationOffset, startColor); // 动态停止点
gradient.addColorStop(1, endColor);
// ... 绘制圆角矩形
}
}
关键技术点:
- 使用
SequentialAnimation实现往返动画 animationOffset作为渐变颜色停止点,实现流动效果- Canvas绘制圆角矩形,使用
quadraticCurveTo实现平滑圆角
2. 渐变进度条(GradientProgressBar)
功能特点:
- 静态水平渐变效果
- 使用Canvas绘制,支持精确的颜色控制
- 蓝色占更大比例,粉色在末端
实现原理:
qml
Canvas {
onPaint: {
// 创建水平渐变
var gradient = ctx.createLinearGradient(0, 0, width, 0);
gradient.addColorStop(0, startColor); // 0% 位置:蓝色
gradient.addColorStop(0.5, startColor); // 50% 位置:仍然是蓝色
gradient.addColorStop(1, endColor); // 100% 位置:粉色
// 绘制圆角矩形
ctx.beginPath();
ctx.moveTo(radius, 0);
ctx.lineTo(width - radius, 0);
ctx.quadraticCurveTo(width, 0, width, radius);
// ... 完整的圆角路径
ctx.closePath();
ctx.fillStyle = gradient;
ctx.fill();
}
}
关键技术点:
- 通过调整
addColorStop的位置控制颜色分布 - 使用
quadraticCurveTo绘制平滑圆角 - 响应
widthChanged和heightChanged信号重绘
3. 呼吸进度条(BreathingProgressBar)
功能特点:
- 透明度呼吸动画效果
- 使用Rectangle的gradient属性实现渐变
- 动画透明度在50-255之间循环变化
实现原理:
qml
// 定义透明度动画属性
property real animationAlpha: 255
// 序列动画:255 -> 50 -> 255 循环
SequentialAnimation on animationAlpha {
running: true
loops: Animation.Infinite
NumberAnimation {
from: 255
to: 50
duration: 1000
easing.type: Easing.InOutQuad
}
NumberAnimation {
from: 50
to: 255
duration: 1000
easing.type: Easing.InOutQuad
}
}
Rectangle {
id: progressBar
width: parent.width * progress
opacity: animationAlpha / 255.0 // 应用透明度动画
gradient: Gradient {
orientation: Gradient.Horizontal
GradientStop { position: 0.0; color: startColor }
GradientStop { position: 1.0; color: endColor }
}
}
关键技术点:
- 使用
SequentialAnimation实现呼吸效果 - 透明度值转换为0-1范围应用到
opacity属性 - 使用
Gradient类型实现水平渐变
4. 垂直末端进度条(VerticalEndProgressBar)
功能特点:
- 基础部分左侧圆角,右侧直角
- 末端部分完全圆形
- 两部分无缝衔接
实现原理:
qml
// 基础进度条部分(左侧圆角,右侧直角)
Item {
id: baseProgress
width: {
var w = parent.width * progress;
var r = parent.height / 2;
// 如果进度超过需要垂直末端的阈值,留出垂直末端的空间
if (w > parent.width - r * 2) {
return Math.max(0, parent.width - r * 2);
}
return w;
}
Canvas {
onPaint: {
// 绘制:左侧圆角,右侧直角
ctx.beginPath();
ctx.moveTo(radius, 0);
ctx.lineTo(width, 0); // 顶部右侧直角
ctx.lineTo(width, height);
ctx.lineTo(radius, height);
ctx.quadraticCurveTo(0, height, 0, height - radius);
ctx.lineTo(0, radius);
ctx.quadraticCurveTo(0, 0, radius, 0);
ctx.closePath();
// ... 填充渐变
}
}
}
// 垂直末端部分(有圆角)
Rectangle {
id: verticalEnd
anchors.left: baseProgress.right
width: {
var w = parent.width * progress;
var r = parent.height / 2;
var baseWidth = baseProgress.width;
// 计算垂直末端的宽度:总进度宽度 - 基础部分宽度
var endWidth = w - baseWidth;
endWidth = Math.min(endWidth, r * 2);
endWidth = Math.min(endWidth, parent.width - baseWidth);
return Math.max(0, endWidth);
}
radius: height / 2 // 完全圆形
}
关键技术点:
- 使用两个组件分别绘制基础部分和末端部分
- 基础部分使用Canvas绘制左侧圆角、右侧直角的路径
- 末端部分使用Rectangle的
radius属性实现圆形 - 宽度计算确保两部分无缝衔接,总宽度不超过父容器
开发要点与技巧
1. 进度值计算
所有组件都使用统一的进度计算方式:
qml
property real progress: Math.max(0, Math.min(1, (value - minimum) / (maximum - minimum)))
这确保了进度值始终在0-1范围内,避免越界问题。
2. Canvas绘制圆角
使用quadraticCurveTo绘制平滑圆角:
qml
ctx.beginPath();
ctx.moveTo(radius, 0);
ctx.lineTo(width - radius, 0);
ctx.quadraticCurveTo(width, 0, width, radius); // 右上角
ctx.lineTo(width, height - radius);
ctx.quadraticCurveTo(width, height, width - radius, height); // 右下角
ctx.lineTo(radius, height);
ctx.quadraticCurveTo(0, height, 0, height - radius); // 左下角
ctx.lineTo(0, radius);
ctx.quadraticCurveTo(0, 0, radius, 0); // 左上角
ctx.closePath();
3. 动画性能优化
- 使用
Easing.InOutQuad实现平滑的缓动效果 - 动画属性绑定到Canvas的绘制,避免不必要的重绘
- 使用
clip: true限制绘制区域,提升性能
4. 响应式设计
所有组件都响应尺寸变化:
qml
onWidthChanged: requestPaint();
onHeightChanged: requestPaint();
确保在布局变化时正确重绘。
5. 颜色渐变控制
水平渐变:
qml
var gradient = ctx.createLinearGradient(0, 0, width, 0);
gradient.addColorStop(0.0, startColor);
gradient.addColorStop(1.0, endColor);
使用Gradient类型:
qml
gradient: Gradient {
orientation: Gradient.Horizontal
GradientStop { position: 0.0; color: startColor }
GradientStop { position: 1.0; color: endColor }
}
使用示例
基本使用
qml
import QtQuick 2.15
Column {
spacing: 20
// 动画进度条
AnimatedProgressBar {
width: 300
height: 40
value: 75
startColor: "#2B4AFF"
endColor: "#FF42D5"
}
// 渐变进度条
GradientProgressBar {
width: 300
height: 40
value: 50
}
// 呼吸进度条
BreathingProgressBar {
width: 300
height: 40
value: 80
}
// 垂直末端进度条
VerticalEndProgressBar {
width: 300
height: 40
value: 97
}
}
动态更新进度
qml
Item {
property real progressValue: 0
Timer {
interval: 100
running: true
repeat: true
onTriggered: {
progressValue += 1
if (progressValue > 100) progressValue = 0
}
}
AnimatedProgressBar {
width: 300
height: 40
value: progressValue
}
}
总结与展望
技术总结
本项目成功实现了四种风格的水平进度条组件,展示了Qt/QML在HarmonyOS平台上的强大能力:
- Canvas绘制:实现了复杂的渐变和圆角效果
- 动画系统:利用属性动画实现流畅的视觉效果
- 组件化设计:统一的接口设计,便于复用和扩展
- 性能优化:合理的重绘机制,保证流畅运行
扩展方向
- 垂直进度条:可以基于现有组件扩展垂直方向的进度条
- 更多动画效果:可以添加更多动画类型,如弹性动画、脉冲动画等
- 主题支持:可以添加主题系统,支持暗色/亮色主题切换
- 自定义形状:可以支持更多自定义形状,如波浪形、阶梯形等
最佳实践
- 统一接口:所有组件使用统一的属性接口,便于维护
- 性能考虑:合理使用Canvas和Rectangle,避免过度绘制
- 响应式设计:确保组件在不同尺寸下都能正确显示
- 代码复用:提取公共逻辑,减少代码重复