Что такое конва?

Во-первых, краткое введение в Canvas.

Холст изначально пустой. Чтобы что-то отобразить, скрипту сначала нужно получить доступ к rendering context и нарисовать на нем. Элемент <canvas> имеет метод getContext(), используемый для получения контекста визуализации и его функций рисования. getContext() принимает один параметр, тип контекста. Для 2D-графики, такой как та, что описана в этом руководстве, вы указываете 2d.

const canvas = document.getElementById('container');
const ctx = canvas.getContext('2d');

Исходя из этого, Konva - это фреймворк HTML5 Canvas, расширяющий 2d-контекст. Вы можете использовать Konva для рисования настраиваемых форм, линий, изображений и текста, а также обеспечивает высокопроизводительную анимацию, переходы и обработку событий как для настольных, так и для мобильных приложений.

Структура

Konva имеет три типа классов. Stage, Layer и Shape. Все начинается со сцены. Этап определяет диапазон вашего рисования, как в блокноте.

Этап содержит несколько пользовательских слоев, и каждый слой имеет два <canvas> средства визуализации: средство визуализации сцены и средство визуализации графа попаданий. Средство визуализации сцены - это то, что вы можете видеть, а средство визуализации графика попаданий - это специальный скрытый холст, который используется для высокопроизводительного обнаружения событий.

Каждый слой может содержать несколько фигур и группу фигур. Stage, Layer и Shape похожи на узлы DOM на HTML-странице.

                               Stage
                                 |
                              _______
                             |       |
                           Layer   Layer
                             |       |
                          ______   Shape
                         |      |
                       Group  Shape
                         |
                       _____
                      |     |
                    Shape  Group

Пример: инструмент аннотации

Чтобы создать инструмент аннотации, я сосредотачиваюсь на трех компонентах: ограничивающая рамка, изображение и преобразователь. Ограничивающая рамка предназначена для выбора области, на которой я хочу сфокусироваться. Изображение - это изображение, которое я хочу добавить ограничивающий прямоугольник для аннотации, а трансформатор должен управлять размером ограничивающего прямоугольника.

Для интеграции с React Konva предоставляет библиотеку HTML5 Canvas, работающую с React, под названием React Konva. React Konva - это библиотека JavaScript для рисования сложной графики на холсте с помощью React. Он обеспечивает декларативную и реактивную привязку к Konva Framework.

Демо



Конва Перформанс

  • batchdraw() Метод

Например, при событии onMouseMove, если я использую метод draw(), он может запускаться сотни раз в секунду.

Но при использовании batchdraw() Konva автоматически ограничивает количество перерисовок в секунду на основе максимального количества кадров в секунду, которое браузер может обработать в любой момент времени.

Если состояние прямоугольников изменилось, вы можете выбрать метод обновления. По сравнению с двухсторонним движением мыши, он немного отличается.

  • Управление слоями

Konva создает отдельные слои, каждый слой имеет свои элементы холста. Это означает, что при переходе или обновлении чего-то мне не нужно перерисовывать все элементы холста.

Я разделяю Retangele и Image. При обновлении холста слой изображения не перерисовывается.

  • Кэширование формы

Форма Cache Konva может значительно улучшить производительность. Этого можно добиться, используя метод cache() для преобразования узла в объект изображения.

  • Перерисовка формы

Обычно, когда вам нужно обновить свои формы с помощью layer.draw(), но в небольшом случае вам не нужно заново перерисовывать весь слой, вы можете вместо этого использовать метод shape.draw(). Но у этого случая есть недостаток. То есть, если ваш узел должен быть размещен под другими узлами, shape.draw() переопределит предыдущую форму наверху.

Если я использую перерисовку формы, мой трансформатор будет покрыт моим новым прямоугольником.

Обсуждение

  • Интегрируйте с CSS