Konva基本处理流程和相关架构设计

前言

canvas是使用JavaScript基于上下文对象进行2D图形的绘制的HTML元素,通常用于动画、游戏画面、数据可视化、图片编辑以及实时视频处理等方面。基于Canvas之上,诞生了例如 PIXI、ZRender、Fabric、Konva等 Canvas渲染引擎,兼顾易用的同时保证了优秀可靠的渲染性能。

虽然对PIXI、Fabric也有所了解,但个人最早接触的是Konva,之后的系列文章都是基于Konva进行学习总结,涉及到其相关架构设计、优化策略等方面,Konva版本是v9.2.1。

Konva的基本使用

Konva API非常清晰易用,代码组织层次清晰明了,这也是基于Konva学习总结的原因之一,使用起来很顺畅舒服。Konva的基本使用形式如下:

// 容器
const stage = new Konva.Stage({container: "root",width: window.innerWidth,height: window.innerHeight
});// 层
const layer = new Konva.Layer();// 圆
const circle = new Konva.Circle({x: stage.width() / 2,y: stage.height() / 2,radius: 10,fill: 'red',stroke: 'black',strokeWidth: 1
});layer.add(circle);
stage.add(layer);

代码结构非常清晰:

  • 容器对象Stage包含层对象Layer,支持多个层对象添加
  • 层对象包含图形对象,支持多个图形对象添加

Konva的代码组织结构通常如下图:

Konva代码结构
Konva封装了常用的图形对象,例如Rect、Circle、Text、TextPath等,同时还支持自定义Shape,每个图形对象都可以直接绑定对应的事件以及通过Group进行分组,Konva更多的用法可以去官网查看,这里就不在赘述了。

Konva部分架构设计

Konva整体代码的架构设计非常清晰,在Konva中无论是Stage、Layer、Group还是各种图形Shape都是节点,对应的结构图如下:

Konva部分架构设计
Container表示容器类,继承自该类Stage、Layer都具有容器特性,即可以添加子节点。

Stage的处理流程

Stage本质就是容器,实际上在内部的处理也是如此,主要的处理逻辑如下:

class Node {constructor(config) {...this.setAttrs(config);...}
}
class Container extends Node {constructor() {super(...arguments);this.children = [];}...
}
class Stage extends Container {constructor(config) {super(checkNoClip(config));...this._buildDOM();this._bindContentEvents();...}...
}

这里关心的Stage最主要的处理逻辑有三点:

  • 处理Stage配置属性
  • 调用buildDOM方法:创建新的div节点作为content挂载在根节点DOM下
  • 调用bindContentEvents:绑定一些事件到content DOM节点上

Stage主要逻辑就是创建一个content节点挂载到对应节点上,content节点会绑定一些事件,即content节点会作为事件响应层来接收事件并做相关处理,这里涉及到的事件主要是mouse相关事件、touch相关事件、pointer相关事件。

Stage创建的content节点内容如下:

<div class="konvajs-content" role="presentation" style="position: relative; user-select: none; width: 749px; height: 758px;"></div>

Layer处理流程

Stage仅仅创建内容容器作为事件接收层,Layer表示图层对象,实际上就是创建对应的canvas节点。Layer的具体处理逻辑如下:

class Layer extends Container {constructor(config) {super(config);this.canvas = new SceneCanvas();this.hitCanvas = new HitCanvas({ pixelRatio: 1 });this._waitingForDraw = false;...}
}

Layer类主要是创建两个Canvas图层:

  • SceneCanvas:表示场景Canvas图层,即绘制图形并显示出来的Canvas
  • HitCanvas:表示命中Canvas图层,用来支持后续图形选中的处理逻辑,这里暂不关心

这里主要关心的是SceneCanvas的处理逻辑,实际上在Konva内部针对Canvas的创建进一步抽象的架构设计如下图所示:

Konva Canvas架构设计
Konva中每一个Canvas对象的内部实际上就是调用对应的Context类实例化上下文对象,相关的处理逻辑这里就不在展开了。

实际上Layer对象创建后Canvas图层并没有挂载到Stage Content节点上,只有当Layer对象添加到Stage对象后才进行挂载,无论是Stage还是Layer的add实例方法都比较重要,涉及到Konva的渲染机制,后续进行。

总结

Konva API使用方便简单,内部架构设计也非常清晰明了,对本文的一些点做下总结:

  • Stage类会创建div节点作为事件接收层并挂载到挂载DOM节点上
  • Layer类内部会创建两类Canvas图层,SceneCanvas用于显示图形渲染结果并挂载到Stage创建的content dom上,HitCanvas用于后续图形选中处理逻辑,位于内存中不会挂载到页面

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/88444.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP协议与UDP协议

TCP&#xff08;传输控制协议&#xff09;和UDP&#xff08;用户数据报协议&#xff09;是两种常见的互联网传输协议&#xff0c;它们在数据传输方面有一些重要的区别&#xff1a; 连接性&#xff1a;TCP是面向连接的协议&#xff0c;而UDP是无连接的协议。这意味着在使用TCP进…

基于微信小程序的电影院订票系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言运行环境说明用户微信小程序端的主要功能有&#xff1a;管理员的主要功能有&#xff1a;具体实现截图详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考论文参考源码获取 前言 &#x1f497;博主介绍&…

ASCII码-对照表

ASCII 1> ASCII 控制字符2> ASCII 显示字符3> 常用ASCII码3.1> 【CR】\r 回车符3.2> 【LF】\n 换行符3.3> 不同操作系统&#xff0c;文件中换行 1> ASCII 控制字符 2> ASCII 显示字符 ASCII&#xff08;American Standard Code for Information Interc…

【计算机网络】IP协议

目录 前言 IP协议 基本概念 IP协议格式 分片 16位标识 3位标志与13位片偏移 分片流程 网段划分 网络号和主机号 DHCP协议 CIDR划分方案 特殊的ip地址 ip地址数量限制 私有ip地址与公网ip地址 路由转发 前言 我们前面讲了HTTP/HTTPS协议和TCP/…

ElementUI - 主页面--动态树右侧内容管理

一.左侧动态树 1.定义组件 ①样式&数据处理 <template><el-menu class"el-menu-vertical-demo" background-color"#334157"text-color"#fff" active-text-color"#ffd04b" :collapse"collapsed" router :def…

centos7通过docker搭建nginx+php环境

以下环境都是基于centos7.9完成。 1.安装docker yum install docker-ce 说明&#xff1a;这一步&#xff0c;由于centos软件仓库没有收纳docker&#xff0c;需要自己去官网爬文档安装。 安装完成之后&#xff0c;就是启动docker服务以及添加到开机启动。 systemctl enable do…

相乘(蓝桥杯)

相乘 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 小蓝发现&#xff0c;他将 1 至 1000000007 之间的不同的数与 2021 相乘后再求除以 1000000007 的余数&#xff0c;会得到不同的数。 小蓝想知道&#xff0c;能不能在 1 …

WordPress主题开发( 七)之—— 模版文件继承规则

WordPress主题开发&#xff08; 七&#xff09;之—— 模版文件继承规则 概述模板文件层次结构示例可视化概述层次结构详细信息主页显示首页显示单文章页面单页分类目录标签自定义分类自定义文章类型作者显示日期搜索结果404&#xff08;未找到&#xff09;附件嵌入功能非ASCII…

Spring Cloud Alibaba快速整合OpenFeign

文章目录 spring cloud alibaba 整合OpenFeign整合流程1.导入依赖2. 编写调用接口2.1 service&#xff08;这里写的是clients&#xff09;2.2 controller 3.设置其最大链接时间3.1 配置文件3.2 client3.3 接口3.4 被访问的controller spring cloud alibaba 整合OpenFeign Fore…

如何评估商城源码的安全性和稳定性?

评估商城源码的安全性和稳定性是选择合适的商城源码的关键一步。以下是一些方法和指标&#xff0c;可用于评估商城源码的安全性和稳定性。希望对大家有所帮助(仅供参考)。 1、源码质量 商城源码的质量是评估其安全性和稳定性的重要指标之一。我们技术可以检查源码的编码规范、…

【算法新题】TJOI2017-异或和

题目内容 原题链接 给定一个长度为 n n n 的整数数组 a a a &#xff0c;问所有子数组和的异或和是多少。 数据范围 1 ≤ n ≤ 1 0 5 1\leq n\leq 10^5 1≤n≤105 ∑ a i ≤ 1 0 6 \sum a_i\leq 10^6 ∑ai​≤106 题解 基本思路 本题是 ARC092D - Two Sequences 的同类型…

深拷贝与浅拷贝

首先深拷贝与浅拷贝 只针对Object 和Array这样的引用数据类型 所以基本数据类型不用考虑了 等号赋值 基本数据类型 对于基本数据类型&#xff0c;就会创建一个新的变量&#xff0c;并将原变量的值复制给新变量。 这是基于变量是存储在栈内存中的特点。简单来说&#xff0c;等…

分享三个国内可用的免费GPT-AI网站

AIchatOS国内的不需要梯子 AItianhu同上 国内百度的文心一言一样非常优秀

订阅《复现SCI文章系列教程》

写在前面 《小杜生信笔记》准备开启新的订阅专栏**《复现期刊文章系列教程》&#xff0c;本专栏小杜会寻找一些自己感兴趣的文章进行复现&#xff08;不说百分之百的复现&#xff0c;但是也会百分之八十进行复现&#xff09;。本期刊的教程代码会全部进行公开&#xff08;通过订…

数据结构:顺序表

SeqList.h #pragma once #include<stdio.h> #include<assert.h> #include<stdlib.h>typedef int SLDataType; //#define NULL 0typedef struct SeqList {SLDataType* a;int size;//顺序表中存储的有效元素的个数int capacity;//空间的大小 }SL;void SLInit(…

jupyterlab开发环境最佳构建方式

文章目录 背景jupyterlab环境构建运行虚拟环境构建以及kernel映射验证总结 背景 从jupyter notebook切换到了jupyter lab. 这里记录一下本地环境的最佳构建方式. jupyter lab 安装在jupyterlab-local的anaconda 虚拟环境中.建立多个其他虚拟环境安装各种python包实现环境隔离,…

一文了解亚马逊云科技适用于 Amazon Lightsail 的托管数据库

Amazon Lightsail 是亚马逊云科技提供的一种易上手使用、月度价格经济实惠&#xff0c;并包括了计算实例、容器、存储、数据库的虚拟专用服务器。在创建时可以进行业务蓝图选择&#xff0c;可选择包含多种操作系统&#xff08;Linux/Windows 等&#xff09;或操作系统加上典型应…

数智化基建:HOOPS技术在基建中可行性作用分析

自改革开放以来&#xff0c;我们一直致力于基础设施建设的发展。这个过程中&#xff0c;基础设施已经取得了显著的成就&#xff0c;从高速公路到高铁&#xff0c;再到大型机场和港口。然而&#xff0c;如今基建行业正面临一个新的挑战&#xff1a;数智化转型。在这个转型的过程…

Dockerfile 修改文件角色容量变大

需求&#xff1a; 在使用dockerfile 编写镜像的时候copy 了文件&#xff0c;然后又修改了文件的 owner 发现镜像变大了期望不要变大 进程&#xff1a; dockerfile 来创建的镜像是根据命令一行一行叠加的大小于是这边将copy 的命令改成 run 并且将权限的修改也放在同一行not …

Python并发执行(未完待续)

python的多进程执行 多进程实现方式一 from multiprocessing import Processdef func1(name):print("测试 %s 多进程" %name)if __name__ "__main__":process_list []for i in range(5):p Process(target func1, args (Python, ))p.start()process_…