如何使用React Native制作圆形加载条

简介:


先放运行截图说明做什么吧,

react-native-percentage-circle 项目地址

最近需求需要一个显示百分比的加载条。然而去搜索了很久,没能发现比较满意的组件,只好自己解决了。当然对于大多数前端而言,这个并不是特别难的,可能思路众多,然而面对React Native似乎就有点相形见绌了。解决这样的问题,我们还是得回归前端本身,看看有什么可以嫁接的方案没。

前端常规制作进度条方法

前端实现相对容易点,我们可以用canvas去绘制圆,也可以用SVG去绘制.

使用SVG


 
 
  1. <svg style="width:2.8rem" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 130 130" overflow="visible" enable-background="new 0 0 130 130" id="progress"
  2.     <circle fill="none" stroke="#ccc" stroke-width="4" stroke-miterlimit="10" cx="64.8" cy="64.8" r="59.8"></circle> 
  3.     <circle class="styled" fill="none" stroke="#2ecc71" stroke-width="4" stroke-miterlimit="10" cx="64.8" cy="64.8" r="59.8" style="stroke-dashoffset: -93.9336; stroke-dasharray: 375.734;"></circle> 
  4.   
  5.  </svg>  

SVG主要是用Circle进行绘制,关于Circle使用可以看 这里 。我们先绘制第一个圆,用于底色。接下来我们只需要在上面绘制一个带有色彩的圆(切记不要填充颜色fill="none")。这个时候我们需要了解两个关键的属性;

stroke-dasharray: 用于控制路径绘制中虚线和间距的。例子中的即圆的周长。

stroke-dashoffset: 用于指定距离虚线绘制的起点

如果我们知道了这个的话,我们只需要计算出圆的周长


 
 
  1. var CircleLength = R * 2 * Math.PI; 
  2.  
  3. var PercentOffset = - CircleLength * yourPercent;  

然后将这个第二个Circle属性赋予到style中:


 
 
  1. style="stroke-dashoffset: -93.9336; stroke-dasharray: 375.734;" 

SVG相对来说还算是比较易用的解决方案, Demo点击预览;

使用 CSS渐变

还有一个更加直接的方法,就是利用 CSS3 中的linear-gradient:

效果如图:

我们只需要指定line-grdient中通过旋转的角度然后设置好间隔的渐变百分比就行啦。


 
 
  1. background-image:linear-gradient(90deg, transparent 50%, #16a085 50%), linear-gradient(90deg, #eee 50%, transparent 50%); 

下图为隐藏掉遮挡的小圆的样子。

代码如下:


 
 
  1. .circle1{ 
  2.   position:relative
  3.   width:110px; 
  4.   height:110px; 
  5.   border-radius:100%; 
  6.   background-color: #eee; 
  7.   background-image:linear-gradient(90deg, transparent 50%, #16a085 50%),     linear-gradient(90deg, #eee 50%, transparent 50%); 
  8.  } 
  9. .circle2{ 
  10.   position:relative
  11.   top:5px; 
  12.   left:5px; 
  13.   width:100px; 
  14.   height:100px; 
  15.   border-radius:100%; 
  16.   background-color: #fff; 
  17. }  

使用CSS Transform

如果要用Transform 的话,这个脑洞就比较大了,解决的方案也有很多,今天自己分享一个相对不烧脑的解决方案:

 图3-1

 图3-2

如图 我们需要建立一个外部的圆,也就是用于绘制灰色的底色,然后再用一个区域进行层级遮挡(也可以自己用border来模拟啦)。记住属性一定要有overflow:hidden.

接下来我们需要添加左右两个分区,用于放置进行彩条绘制的容器。如图3-1我们设置左分区一个,里面是一个左半圆,而这个半圆距离容器距离是100%,默认是不可见的。然后它需要围绕圆心旋转,比较巧妙的是,它需要旋转过180度后,才会回到它的父容器可见区域。如图3-2同理我们可以设置右半区,然后将半圆放在-100%的距离,即右半圆默认也不可见的。当它开始旋转的时候即如下图红色区域就是我们的角度:

注意由于是两个圆进行配合,因此角度过180度,时候,左半圆则开始旋转,而右半圆则保持180度即可。


 
 
  1. .left-wrap{ 
  2.     overflow: hidden; 
  3.     position: absolute
  4.     left:0; 
  5.     top:0; 
  6.     width: 50%; 
  7.     height:100%; 
  8.      
  9. .left-wrap .loader{ 
  10.     position: absolute
  11.     left:100%; 
  12.     top:0; 
  13.     width:100%; 
  14.     height:100%; 
  15.     border-radius: 1000px; 
  16.     background-color: #333;  
  17.     border-top-left-radius: 0; 
  18.     border-bottom-left-radius: 0; 
  19.     transform-origin:0 50% 0; 
  20. // 省略一些右半区代码 
  21.  
  22. .right-wrap{ 
  23.     .... 
  24.     left:50%; 
  25. .right-wrap .loader{  
  26.     ... 
  27.     left:-100%; 
  28.     border-bottom-right-radius: 0; 
  29.     border-top-right-radius: 0;     
  30.     transform-origin:100% 50% 0;     
  31. }  

这些就是前端的一些解决方法当然你也可以选择开源的框架,比如:

如何使用React Native写这样的进度条呢?

前面的前端思路自己倒是有了,于是觉得很easy嘛,不过在开始写的时候发现 尴尬了。 SVG成本比较大,你需要安装依赖react-native-art-svg。用渐变的话,当然也比较麻烦,也需呀安装依赖,自己内心觉得:画一个圆至于么!!!

于是乎开始自己造轮子了,采用了第三种方案,就用view + transform进行组件封装。才开始还挺顺的,不过看官方文档,发现没有对 transform origin支持。虽然支持了rotate ,scale,translate,但是发现这个缺陷,无疑陷入一丝困境。随后发现有人早已提了自己的pr给官方,希望得到支持。类似于 transformOrgin:{x:100}这样子。 当然目前最新版依旧没有纳入到计划中。不过官方支持了transformMatrix , 这个虽好,可是楼主数学却是渣,能不能有一个让学渣快速理解的方案。

The transform-origin property lets you modify the origin for transformations of an element. For example, the transform-origin of the rotate() function is the centre of rotation. (This property is applied by first translating the element by the negated value of the property, then applying the element's transform, then translating by the property value.)

大致意思就是这个属性在进行选择时指定origin的时候,会先将元素平移过去,然后再移回来。所以我们可以在旋转时这样指定:


 
 
  1. <View style={[styles.leftWrap,{ 
  2.   // .... 
  3.   <View style={[styles.loader,{ 
  4.      ...  radius: 半径 
  5.      transform:[{translateX:-this.props.radius/2},{rotate:this.state.leftTransformerDegree},{translateX:this.props.radius/2}],   
  6.      }]}></View
  7.  </View>  

这样自己就可以解决transform origin的问题了。这样写进度就非常easy 啦。自己简单封装了这个组件 react-native-percentage-circle

简单开始:


 
 
  1. npm i react-native-percentage-circle --save 
  2.  
  3. import PercentageCircle from 'react-native-percentage-circle'
  4.  
  5. //... 
  6.  
  7. redner() { 
  8.   <View
  9.     <PercentageCircle radius={35} percent={50} color={"#3498db"}></PercentageCircle>   
  10.   </View
  11. }  

选项说明

Props Type Example Description
color string '#000' 进度条颜色
percent Number 30 百分之多少
radius Number 20 圆的半径

当然目前的参数自己想到的就这些,当然大家可以自己写,也可以提PR ,将它扩展。


作者:静逸秋水

来源:51CTO

相关文章
|
8月前
|
开发框架 前端开发 JavaScript
探索前端开发中的跨平台框架React Native
本文将介绍前端开发中一种备受关注的跨平台框架React Native,通过比较原生应用与React Native的优缺点,探讨其在实际项目中的应用以及未来发展趋势。
108 2
|
8月前
|
开发框架 Dart 前端开发
【Flutter前端技术开发专栏】Flutter与React Native的对比与选择
【4月更文挑战第30天】对比 Flutter(Dart,强类型,Google支持,快速热重载,高性能渲染)与 React Native(JavaScript,庞大生态,热重载,依赖原生渲染),文章讨论了开发语言、生态系统、性能、开发体验、学习曲线、社区支持及项目选择因素。两者各有优势,选择取决于项目需求、团队技能和长期维护考虑。参考文献包括官方文档和性能比较文章。
270 0
【Flutter前端技术开发专栏】Flutter与React Native的对比与选择
|
6月前
|
前端开发 JavaScript Android开发
React Native跨平台开发实战
【7月更文挑战第21天】React Native为跨平台移动应用开发提供了一种高效且强大的解决方案。通过本文的学习,你应该能够掌握React Native的基本概念和实战步骤,并开始在你的项目中使用React Native进行开发。随着你对React Native的深入理解,你将能够利用其强大的功能来构建更加复杂和高效的移动应用。
|
8月前
|
开发框架 移动开发 前端开发
【Uniapp 专栏】Uniapp 与 React Native 的对比分析
【5月更文挑战第14天】Uniapp和React Native是热门的跨平台移动开发框架。Uniapp以其一套代码多端运行、丰富的组件生态和较低的学习曲线受到青睐,适合快速开发简单应用。React Native基于React,拥有活跃社区和优秀性能,适合复杂应用。React Native在性能上略胜一筹,尤其在需要接近原生体验的场景。Uniapp的官方组件弥补了社区资源不足。选择时需考虑开发效率、性能需求、团队技术栈和社区支持。
2070 1
【Uniapp 专栏】Uniapp 与 React Native 的对比分析
|
7月前
|
前端开发 自动驾驶 程序员
鸿蒙? 车载?Flutter? React Native? 为什么我劝你三思,说点不一样的
本文探讨了在信息技术快速发展的背景下,开发者如何选择学习路径。作者提倡使用终局思维来规划职业发展,考虑技术的长远影响。终局思维注重长远目标、系统分析、反向规划和动态调整。以车载开发为例,预测未来智能汽车可能由语音助手主导,而非依赖平板界面。此外,作者建议不要过分投入打工状态,应思考创建自己的产品,如App,以实现技能补充和额外收入。选择对未来发展和自主性有益的技术,如Kotlin,比盲目追求热点更为重要。做减法和有标准的选择,能帮助减轻焦虑,实现更高效的成长。关注公众号“AntDream”获取更多相关内容。
148 1
|
7月前
|
开发框架 前端开发 JavaScript
移动应用开发中的跨平台策略:Flutter与React Native的比较
在移动应用领域,跨平台解决方案已成为开发者追求高效、成本效益和广泛覆盖的关键。本文深入探讨了两种领先的跨平台框架——Flutter和React Native,从技术架构、性能、社区生态及实际应用案例四个维度进行全面对比分析。通过这一比较,旨在为移动应用开发者提供选择合适框架的参考依据,帮助他们根据项目需求做出明智的决策。
|
7月前
|
前端开发 iOS开发 Android开发
React Native跨平台开发实战:从零到一
学习React Native跨平台开发,首先安装Node.js和React Native CLI,设置Android/iOS环境。使用CLI创建项目,如`npx react-native init MyProject`。运行应用:`npx react-native run-android`或`run-ios`。编写组件,如在App.js中创建Hello World。添加样式,安装第三方库如react-native-vector-icons,使用react-navigation进行路由和导航。
124 2
|
8月前
|
前端开发 JavaScript Android开发
使用React Native开发跨平台移动应用的技术详解
【5月更文挑战第22天】本文详述了使用React Native开发跨平台移动应用的技术,该框架由Facebook推出,基于JavaScript,支持iOS和Android。React Native通过JNI/JSI实现JavaScript到原生代码的转换,提供高效性能和原生体验。其优势包括跨平台性、原生体验、开发速度及社区支持。开发流程涉及环境搭建、项目创建、编码、调试与测试,以及构建与发布。注意事项包括性能优化、平台适配、利用第三方库和持续学习。React Native为开发者构建高质量跨平台应用提供了便捷途径,未来潜力无限。
|
7月前
|
JSON 弹性计算 前端开发
函数计算产品使用问题之遇到在自定义运行时部署React项目时遇到样式无法正常加载。一般是什么导致的
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
7月前
|
Dart 前端开发 JavaScript
探索移动应用开发中的跨平台解决方案:Flutter与React Native的比较
在移动应用开发领域,选择合适的跨平台解决方案是关键。本文将深入分析Flutter和React Native这两大主流框架,从性能、开发效率、社区支持等方面进行比较,帮助开发者做出明智的选择。
87 0