【问题标题】:build a Custom Circular Progress bar with React使用 React 构建自定义循环进度条
【发布时间】:2021-11-17 00:48:05
【问题描述】:

我想用 React 和 React Native 来实现这个设计

[![在此处输入图片描述][1]][1]

我尝试使用这个包: React Circle Progressbar

但我无法实现这个设计,所以任何人都可以帮我解决这个问题

我将与您分享我的完整组件,希望它能让您对当前状态有所了解

function polarToCartesian(centerX, centerY, radius, angleInDegrees) {
  var angleInRadians = ((angleInDegrees - 90) * Math.PI) / 180.0;

  return {
    x: centerX + radius * Math.cos(angleInRadians),
    y: centerY + radius * Math.sin(angleInRadians),
  };
}

function describeArc(x, y, radius, startAngle, endAngle) {
  var start = polarToCartesian(x, y, radius, endAngle);
  var end = polarToCartesian(x, y, radius, startAngle);

  var largeArcFlag = endAngle - startAngle <= 180 ? '0' : '1';

  var d = [
    'M',
    start.x,
    start.y,
    'A',
    radius,
    radius,
    0,
    largeArcFlag,
    0,
    end.x,
    end.y,
  ].join(' ');

  return d;
}

【问题讨论】:

  • 请发布您到目前为止所尝试的内容
  • 你可以检查一下,我试过这个方法但我没有实现设计我也使用了描述中的包,没有帮助,@Erik McKelvey
  • 您发布了两个函数的代码,但没有发布组件的外观。请添加您当前实现的屏幕截图

标签: html css reactjs react-native svg


【解决方案1】:

在普通的 SVG 中,类似这样的东西。渐变不是完美的,但是很接近……“进度”的长度可以用stroke-dasharray调整。

<svg viewBox="0 0 200 210" width="200">
  <defs>
    <mask id="m1">
      <circle cx="100" cy="105" r="55" fill="white"/>
    </mask>
    <linearGradient id="lg1" gradientTransform="rotate(0) skewX(-20) skewY(-40)">
      <stop offset="0"  stop-color="red" />
      <stop offset="75%" stop-color="orange" />
    </linearGradient>
  </defs>
  <image mask="url(#m1)" href="https://i.stack.imgur.com/ptG0J.png" width="200" />
  <path pathLength="360" d="M100 175 a 75 75 0 1 1 1 0"
    stroke="LightSlateGray" fill="none" stroke-width="30"
    stroke-linecap ="round" stroke-dasharray="270 360"
    stroke-dashoffset="-45"/>
  <path pathLength="360" d="M100 175 a 75 75 0 1 1 1 0"
    stroke="url(#lg1)" fill="none" stroke-width="15"
    stroke-linecap ="round" stroke-dasharray="180 360"
    stroke-dashoffset="-45"/>
  <g transform="translate(100 180)" font-size="16" font-family="sans-serif" font-weight="bold" text-anchor="middle">
    <text>Overall</text>
    <text transform="translate(0 20)">Wellbeing</text>
  </g>
</svg>

【讨论】:

  • 太好了,谢谢,不知道有没有什么课程教你如何处理SVG,我不太适应
猜你喜欢
  • 2020-11-29
  • 2021-04-08
  • 2011-08-24
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2014-01-29
  • 2019-03-11
  • 2013-07-09
相关资源
最近更新 更多