当前位置:   article > 正文

ReactNative实现一个圆环进度条

ReactNative实现一个圆环进度条

我们直接看效果,如下图

我们在直接上代码

  1. /**
  2. * 圆形进度条
  3. */
  4. import React, {useState, useEffect} from 'react';
  5. import Svg, {
  6. Circle,
  7. G,
  8. LinearGradient,
  9. Stop,
  10. Defs,
  11. Text,
  12. } from 'react-native-svg';
  13. import {View, StyleSheet} from 'react-native';
  14. // 渐变色
  15. const CircleProgress = props => {
  16. const {progress, durationTime, children, customeSvgSize, customeStrokeWidth} =
  17. props;
  18. let svgSize = customeSvgSize ? customeSvgSize : 200; // 画布的宽高
  19. const halfOfSvgSize = svgSize / 2;
  20. const strokeWidth = customeStrokeWidth ? customeStrokeWidth : 10; // 圆形进度条宽度
  21. const radius = (svgSize - strokeWidth) / 2; // 外层半径
  22. const innerRadius = radius - 6; // 内层半径
  23. const circumference = 2 * radius * Math.PI; // 总周长
  24. // 背景色,圆环
  25. const linearGradientColors = [
  26. {stop: '0%', color: '#36B5AA'},
  27. {stop: '50%', color: '#317AF7'},
  28. {stop: '100%', color: '#3396D2'},
  29. ];
  30. const circumferenceWithProgress = circumference * (1 - progress);
  31. const outerCircleCommonConfig = {
  32. fill: 'none',
  33. cx: halfOfSvgSize,
  34. cy: halfOfSvgSize,
  35. r: radius,
  36. strokeLinecap: 'round',
  37. strokeWidth: strokeWidth,
  38. strokeDasharray: `${circumference} ${circumference}`,
  39. };
  40. const [count, setCount] = useState(durationTime);
  41. return (
  42. <View>
  43. <Svg width={svgSize} height={svgSize}>
  44. <Defs>
  45. <LinearGradient x1="100%" y1="100%" x2="0%" y2="0%" id="gradient">
  46. {linearGradientColors.map((item, index) => (
  47. <Stop key={index} offset={item.stop} stopColor={item.color} />
  48. ))}
  49. </LinearGradient>
  50. </Defs>
  51. <G rotation={-90} origin={`${halfOfSvgSize}, ${halfOfSvgSize}`}>
  52. <Circle stroke="#D2D2D2" {...outerCircleCommonConfig} />
  53. <Circle
  54. stroke="url(#gradient)"
  55. fill="none"
  56. {...outerCircleCommonConfig}
  57. strokeDashoffset={circumferenceWithProgress}
  58. />
  59. </G>
  60. </Svg>
  61. <View
  62. style={[{width: svgSize, height: svgSize}, styles.pa, styles.center]}>
  63. {children}
  64. </View>
  65. </View>
  66. );
  67. };
  68. const styles = StyleSheet.create({
  69. main: {
  70. flexDirection: 'row',
  71. },
  72. pa: {
  73. position: 'absolute',
  74. top: 0,
  75. left: 0,
  76. },
  77. center: {
  78. justifyContent: 'center',
  79. alignItems: 'center',
  80. },
  81. });
  82. export default CircleProgress;

注意:1.需要引入react-native-svg库,因为我们用到的是SVG

           2.另外圆环是使用Circle实现,另外使用到了G,用来旋转,不旋转的话,看下图

旋转-45°之后,在看下图

可以看出来哪里不一样了吧

进度是70%,是下面的样子(记得旋转-90°额)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/65808
推荐阅读
相关标签
  

闽ICP备14008679号