ReactNative实现一个圆环进度条

我们直接看效果,如下图

我们在直接上代码

复制代码
/**
 * 圆形进度条
 */
import React, {useState, useEffect} from 'react';
import Svg, {
  Circle,
  G,
  LinearGradient,
  Stop,
  Defs,
  Text,
} from 'react-native-svg';
import {View, StyleSheet} from 'react-native';

// 渐变色
const CircleProgress = props => {
  const {progress, durationTime, children, customeSvgSize, customeStrokeWidth} =
    props;
  let svgSize = customeSvgSize ? customeSvgSize : 200; // 画布的宽高
  const halfOfSvgSize = svgSize / 2;
  const strokeWidth = customeStrokeWidth ? customeStrokeWidth : 10; // 圆形进度条宽度
  const radius = (svgSize - strokeWidth) / 2; // 外层半径
  const innerRadius = radius - 6; // 内层半径
  const circumference = 2 * radius * Math.PI; // 总周长
  // 背景色,圆环
  const linearGradientColors = [
    {stop: '0%', color: '#36B5AA'},
    {stop: '50%', color: '#317AF7'},
    {stop: '100%', color: '#3396D2'},
  ];
  const circumferenceWithProgress = circumference * (1 - progress);
  const outerCircleCommonConfig = {
    fill: 'none',
    cx: halfOfSvgSize,
    cy: halfOfSvgSize,
    r: radius,
    strokeLinecap: 'round',
    strokeWidth: strokeWidth,
    strokeDasharray: `${circumference}  ${circumference}`,
  };

  const [count, setCount] = useState(durationTime);
  return (
    <View>
      <Svg width={svgSize} height={svgSize}>
        <Defs>
          <LinearGradient x1="100%" y1="100%" x2="0%" y2="0%" id="gradient">
            {linearGradientColors.map((item, index) => (
              <Stop key={index} offset={item.stop} stopColor={item.color} />
            ))}
          </LinearGradient>
        </Defs>
        <G rotation={-90} origin={`${halfOfSvgSize}, ${halfOfSvgSize}`}>
          <Circle stroke="#D2D2D2" {...outerCircleCommonConfig} />
          <Circle
            stroke="url(#gradient)"
            fill="none"
            {...outerCircleCommonConfig}
            strokeDashoffset={circumferenceWithProgress}
          />
        </G>
      </Svg>
      <View
        style={[{width: svgSize, height: svgSize}, styles.pa, styles.center]}>
        {children}
      </View>
    </View>
  );
};
const styles = StyleSheet.create({
  main: {
    flexDirection: 'row',
  },
  pa: {
    position: 'absolute',
    top: 0,
    left: 0,
  },
  center: {
    justifyContent: 'center',
    alignItems: 'center',
  },
});
export default CircleProgress;

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

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

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

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

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

相关推荐
祖国的好青年18 小时前
VS Code 搭建 React Native 开发环境(Windows 实战指南)
android·windows·react native·react.js
一个扣子19 小时前
性能面板解读:通过 Hermes Runtime 测量函数执行耗时
react native·chrome devtools·hermes·性能面板·函数耗时·performance api
kyriewen1121 小时前
Next.js部署:从本地跑得欢,到线上飞得稳
开发语言·前端·javascript·科技·react.js·前端框架·ecmascript
朝阳391 天前
react【实战】首页 -- 白天/黑夜主题切换(含组件封装)
前端·react.js·前端框架
光影少年2 天前
大屏页面,一次多个请求,请求加密导致 点击 全局时间选择器 时出现卡顿咋解决(面板收起会延迟1~2秒)
前端·javascript·vue.js·学习·前端框架·echarts·reactjs
vipbic2 天前
厌倦了重度耦合?我用 Vue3 撸了一个真·插件化中后台框架
vue.js·前端框架·前端工程化
朝阳392 天前
react【实战】首页 -- 响应式导航栏(含带联动动画的搜索框)
前端·react.js·前端框架
前端AI充电站2 天前
第 7 篇:让 RAG 答案可追溯:展示知识库引用来源
前端·人工智能·前端框架
前端AI充电站2 天前
第 9 篇:让 AI 助手记住会话:示例问题点击发送与 localStorage 持久化
前端·人工智能·前端框架
吃西瓜的年年2 天前
react(五)路由
前端·react.js·前端框架