WPF案例实战 – 深度剖析一个弧形进度条的实现
# 1、使用 Path 结合 ArcSegment 绘制圆弧
## 1、属性解读
Path 是 WPF 中的一个标记元素,用于绘制复杂的几何路径形状,而 ArcSegment 用于描述 Path 中两点之间的一条椭圆弧。两者结合可以很轻松的实现圆弧效果。
通常使用以下几个属性控制 ArcSegment:
## 2、静态圆弧
在 WPF 中,原点坐标始终位于左上角,知道这个概念,那么就可以按照下面代码绘制一个弧形:
“`csharp
<Path Stroke=\”SlateBlue\” StrokeThickness=\”8\” Width=\”200\” Height=\”200\”>
<Path.Data>
<PathGeometry>
<PathFigure IsClosed=\”False\” StartPoint=\”90,180\”>
<ArcSegment IsLargeArc=\”True\”
Point=\”180,90\”
Size=\”90,90\”
SweepDirection=\”Clockwise\”/>
</PathFigure>
</PathGeometry>
</Path.Data>
</Path>
“`
代码说明:绘制一个起点(90,180)到终点(180,90) 的顺时针方向的大圆弧。
有人看了就要说了,我要的是一个左右对称的圆弧,很简单,我们给他旋转45度就行了,在Path上增加旋转属性,代码如下:
“`csharp
<Path Stroke=\”SlateBlue\” StrokeThickness=\”8\” Width=\”200\” Height=\”200\” RenderTransformOrigin=\”0.5,0.5\”>
<Path.RenderTransform>
<TransformGroup>
<RotateTransform Angle=\”45\”/>
</TransformGroup>
</Path.RenderTransform>
<Path.Data>
<PathGeometry>
<PathFigure IsClosed=\”False\” StartPoint=\”90,180\”>
<ArcSegment IsLargeArc=\”True\”
Point=\”180,90\”
Size=\”90,90\”
SweepDirection=\”Clockwise\” x:Name=\”pathArc\”/>
</PathFigure>
</PathGeometry>
</Path.Data>
</Path>
“`
RenderTransformOrigin 表示旋转中心,整个Path我们把它看作为0到1的区域大小,中心点位置就是(0.5,0.5)。
有人又说了,那进度条怎么实现,其实,我们在原来圆弧基础上再覆盖一个不一样颜色的就行。代码如下所示:
“`csharp
<Path Stroke=\”#6BCD5A\” StrokeThickness=\”5\” Width=\”200\” Height=\”200\” RenderTransformOrigin=\”0.5,0.5\”>
<Path.RenderTransform>
<TransformGroup>
<RotateTransform Angle=\”45\”/>
</TransformGroup>
</Path.RenderTransform>
<Path.Data>
<PathGeometry>
<PathFigure IsClosed=\”False\” StartPoint=\”90,180\”>
<ArcSegment IsLargeArc=\”True\”
Point=\”180,90\”
Size=\”90,90\”
SweepDirection=\”Clockwise\” x:Name=\”pathArc\”/>
</PathFigure>
</PathGeometry>
</Path.Data>
</Path>
“`
这里我们通过两个圆弧的 StrokeThickness 数字大小来实现圆弧边界,覆盖的圆弧一般小于底色圆弧,保证一种内部镶嵌的感觉。为了凸显对比度,我把窗体背景色改为 Background=\”#959494\” 。效果如下:
## 3、动态圆弧
那么问题来的,进度条都是动态的,那么怎么实现动态变化效果呢,这里我们需要先学习一下弧形计算的基础知识。首先,我们要知道圆弧线的坐标计算公式如下:
– **x轴坐标** 计算公式为:x = 圆心x + 半径 × cos(弧度)。
– **y轴坐标** 计算公式为:y = 圆心y + 半径 × sin(弧度)。
接下来了解就是根据这个公式动态计算圆弧坐标,再利用定时器动态绘制圆弧即可。注意前面我给覆盖层的圆弧取了一个别名 x:Name=\”pathArc\”,方便后台获取绘制的圆弧对象,我们写一个方法 CalculateEndPoint 来计算弧形的终点坐标,代码如下:
“`csharp
/// <summary>
/// 计算弧线终点坐标
/// </summary>
/// <param name=\”Value\”>弧形当前值</param>
/// <param name=\”Min\”>弧形最小值</param>
/// <param name=\”Max\”>弧形最大值</param>
/// <param name=\”totalAngle\”>整个弧形的角度</param>
/// <param name=\”offsetAngle\”>弧形缺失的角度</param>
private void CalculateEndPoint(int Value,int Min,int Max,int totalAngle,int offsetAngle)
{
//值有效性校验
int value = Value >= Max ? Max : Value <= Min ? Min : Value;
int radius = 90;//圆弧半径
//计算圆弧坐标
// 1、计算圆弧角度 我们给弧度设定一个最小值和最大值,最小值表示0度,对最大值表示圆弧最大角度 这里我们的圆弧最大角度为270度
//根据相似性就有以下等式成立 (当前圆弧值-最小值)/(最大值-最小值)=当前圆弧角度/总的圆弧角度
//得到 当前圆弧角度=总的圆弧角度*(当前圆弧值-最小值)/(最大值-最小值)
//2、计算角度
double angle = totalAngle / (Max – Min) * (Value – Min);
//3、计算弧度
//计算弧度 加上圆形缺失的角度值(面板有90度是缺失的)
double rad = (Math.PI / 180) * (angle + offsetAngle);
//4、计算弧线终点坐标
//x = 圆心x + 半径 × cos(角度)。
double x = radius * Math.Cos(rad) + radius;
//y = 圆心y + 半径 × sin(角度)。
double y = radius * Math.Sin(rad) + radius;
Point point = new Point(x, y);
pathArc.IsLargeArc = angle > 180;
pathArc.Point = point;
}
“`
代码注释请详细观看哦,每一步的计算都写了详细说明。
## 4、运行效果
## 5、圆弧两端点的形状
有些同学又想问了,我们的需求是要两端是圆形的,现在弧线两端都是平平的直角,不满足需求。那么我介绍下 Path 的两个属性 StrokeStartLineCap 和 StrokeEndLineCap ,这两个就是用来描述起始和终点端点的样式,样式支持的是 PenLineCap 枚举类型,一共有四种形态,满足各种端点需求,可首位不同组合使用:
所以要实现圆形端点,给 Path 代码修改如下:
“`csharp
<Path Stroke=\”SlateBlue\” StrokeThickness=\”8\” Width=\”200\” Height=\”200\” RenderTransformOrigin=\”0.5,0.5\” StrokeStartLineCap=\”Round\” StrokeEndLineCap=\”Round\”>
“`
# 2、总结
以上就是今天要讲的内容,本文详解析了一个圆弧的绘制和动态绘制实现
NProgress.js,一款神奇的 JavaScript 开源库——页面进度条
Github Star: 26k[1] 官网[2]
NProgress.js 是一个轻量级的 JavaScript 库,用于在应用的页面顶部显示一个进度条,指示页面加载或异步操作的进度。它非常适合用于单页面应用程序(SPA),能够在路由变化时给用户友好的加载提示。本文是 NProgress.js 的基本使用方法和一些配置选项的详细介绍。
安装和引入
NProgress.js 支持管理工具 npm 或 yarn 安装,也支持 CDN 引入。
引入时,别忘了引入 nprogress.css 样式文件
启动和结束进度条
设置进度
设置进度百分比,参数取值 0 ~ 1 之间。如果传 0 类似于调用 .start(),传 1 类似于调用 .done() 方法。
递增进度条
递增进度条,以随机量增加,永远不会到达 100%。
配置项还有 template 自定义模板,为了保证正常工作,需要保留一个带 role=\’bar\’ 的元素。参考默认模板。
另外,通过覆盖 nprogress.css 样式,可以实现定制化样式。
在 Vue 项目中,可以将 NProgress.js 集成到路由系统中,方便页面跳转时显示进度条。在 router/index.js 中引入 NProgress 并在路由卫士中调用相应的 API。
修改进度条样式
通过添加 CSS 样式来自定义进度条的颜色和其他视觉效果。
NProgress.js 使用一种简单的方式来改善用户体验,在单页应用中,通过在页面跳转期间显示进度条,可以让用户知道页面正在加载,从而减少用户的等待焦虑感。通过本文相信你已经能够在项目中轻松使用 NProgress.js 了。
祝好!
[1] Github Star: 26k: https://github.com/rstacruz/nprogress[2] 官网: https://ricostacruz.com/nprogress/
使用Python制作进度条有多少种方法?看这一篇文章就够了!
偶然间刷到一个视频,说到:当程序正在运算时,会有一个较长时间的空白期,谁也不知道程序运行的进度如何,不如给它加个进度条。当时那位博主就说了一种还是两种方法来着……忘了[笑哭]。
于是我今个就搜寻一下,Python版的进度条都可以怎么写!
进度条的格式是\”{当前循环次数} / {总循环次数}\”。其中,循环次数从1开始,到500,000结束。
通过使用end=\’\\r\’参数,print语句的输出不会换行,而是每次循环都会覆盖上一次的输出。这样就实现了实时更新进度条的效果。
该代码将打印出一行字符,并且字符的总长度为50个字符。 其中,字符的内容为\”@\”的重复,重复的次数为50次。 外面的\”| |\”是用来给字符串添加边框的,以增加可读性。
3和4是可以结合起来的 :
输出结果:
官网:tqdm · PyPI
安装这个库:pip install tqdm。
示例代码:
官网链接:alive-progress · PyPI
安装库:pip install alive-progress
示例代码:
效果图:
安装库: pip install rich
这个截图没有在Pycharm编辑器里截图的原因是:
显示不全哈哈[看]。
Rich 是一个 Python 库,主要用于在终端中提供富文本和精美格式。它通过 API 允许用户轻松地为终端输出添加颜色和样式,支持绘制漂亮的表格、进度条、markdown 格式输出、语法高亮、源代码回溯等多种功能。Rich 库支持在 Linux、OSX 和 Windows 上运行,其中在新的 Windows 终端上可以支持真彩色和表情符号,而经典终端的色彩限制为8种颜色。此外,Rich 还可以与 Jupyter 笔记本一起使用,无需其他配置。
tqdm源自阿拉伯语(تقدّم)意思是“进步”,在西班牙语中是“我非常爱你”的缩写()。立即让你的循环显示一个智能的进度条。
alive-progress的一些亮点:
- 一个令人着迷的实时微调器,清楚地显示您的冗长过程没有崩溃,您的 SSH 连接没有冻结,视觉反馈会对您的处理速度做出反应。
- 一个高效的多线程栏,以实际处理速度的一小部分进行自我更新,以保持较低的 CPU 使用率并避免终端垃圾邮件(每秒 1,000,000 次迭代相当于每秒大约 60 次更新,您也可以根据自己的喜好进行校准)。
- ETA(预计到达时间)功能,具有智能,可显示完成时间,使您能够更有效地计划时间并管理工作负载。
- 自动打印和记录挂钩,提供无缝集成和轻松跟踪,甚至在它们发生时用当前的条形位置来丰富它们。
- 当处理完成时,它会打印出一个不错的收据,包括经过的时间和观察到的吞吐量。
- 它检测下溢和溢出,使您能够跟踪命中、未命中或任何所需的计数,而不一定是实际迭代。
- 你可以暂停它!没错,你先在这里听到了!任何地方都没有其他进度条具有此功能!您可以在任何处理过程中返回 Python 提示符,调整一些项目,然后回到该正在运行的进程,就好像它从未停止过一样!所有小部件都保持原样,经过的时间很好地忽略了暂停的时间!alive_bar
- 它是高度可定制的,有各种微调器和酒吧样式,以及几个现成的工厂,可以轻松生成你的!您甚至可以使用超级强大且酷炫的工具来帮助您设计自己的动画!您可以在屏幕上看到所有生成的帧和循环,具有多个详细级别,甚至包括的再现!无限的创造力触手可及
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。