Как разработать анимацию процентной круговой диаграммы

внешний интерфейс SVG React.js Canvas

Сегодня я поделюсь с вами реактивным компонентом динамической процентной круговой диаграммы, недавно разработанной в соответствии с потребностями бизнеса (сегодня она относительно простаивает).

Сначала я использовал CSS3, чтобы понять, что я не могу добиться этого эффекта, а затем я попытался использовать Canvas, но обнаружил, что он не подходит в половине случаев, и есть неясные проблемы, поэтому я сдался. Наконец решил использовать SVG!

Основная идея состоит в том, чтобы использовать команду дуги эллипса пути (A) для рисования сектора, а затем увеличивать или уменьшать дугу сектора в соответствии с приращением (значение в поле ввода).Поле ввода предназначено только для демонстрации, и фактически используются данные фонового интерфейса.

Структура HTML выглядит следующим образом:

Инструкции по эллиптической дуге SVG от :(CSDN)

инструкция А (абсолютное) а (относительное)
имя эллиптическая дуга
параметр

Код: RX RY X-AXIS-ROTITATION HARD-ARCE-FLAG FLAG FLOW-FLAG X Y

rx ry- длины двух полуосей эллипса.

x-axis-rotationугол поворота эллипса относительно системы координат в градусах, а не в радианах.

large-arc-flagОтмечать ли на чертеже большую дугу (1) или маленькую дугу (0).

sweep-flagМаркер рисуется по часовой стрелке (1) или против часовой стрелки (0).

x y – координаты конечной точки дуги.

описывать Нарисуйте дугу эллипса от текущей точки до точки (x, y). Размер и направление эллипса определяются параметрами (rx, ry) и вращения оси x. Параметр вращения оси x указывает общий эллипс относительно текущей системы координат Угол поворота. Координаты центра (cx, cy) эллипса вычисляются автоматически, чтобы удовлетворить другие параметрические ограничения. Флаг большой дуги и флаг развертки также используются для расчета и рисования дуги.

Не думайте сначала об эффекте анимации, просто посмотрите, как нарисовать веер: (Сложнее сказать, просто расскажите построчно в комментариях)


где PI — константа, которую я определил перед компонентом:const PI = 3.1416

x1, y1, x2, y2, объявленные вышеприведенным кодом, представляют координаты начального и конечного ребер дуги, как показано на рисунке:

Таким образом, функция рисования формы веера написана~

Следующий шаг — заставить его двигаться! И гладкой, как шелк! Как это исправить? Конечно использоватьrequestAnimationFrame! Если вы еще этого не знаете, пожалуйста, перейдите ->Портал MDN


Затем просто вызовите animationSvg. Вы можете получить значение в радианах из поля ввода или получить расчет из данных в фоновом режиме. Обратите внимание, что его необходимо преобразовать из процентов в радианы:

const value = Number((this.input.value / 100) * PI * 2);
this.animationSvg(value);

Этим достигается эффект GIF в начале статьи, который можно резюмировать следующим образом:

  1. Получить данные, увеличить или уменьшить, единица измерения - радианы;
  2. Выполнить анимацию requestAnimationFrame;
  3. Вычислить путь и визуализировать его в DOM;
  4. Повторяйте шаги со 2 по 3, пока не будет достигнут конец дуги.

Увидеть значит поверить, вы можете перейти сюда, чтобы посмотреть онлайн-ДЕМО:портал 

Возможно, реализация кода не самая лаконичная, все великие боги, проходящие мимо, могут дать предложения~