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 支持管理工具 npmyarn 安装,也支持 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

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。