首页 > 其他分享 >Konva-前端绘图框架

Konva-前端绘图框架

时间:2024-01-11 11:26:32浏览次数:22  
标签:layer group Konva 添加 绘图 konva 前端 stage

一、介绍
Konva is an HTML5 Canvas JavaScript framework that extends the 2d context by enabling canvas interactivity for desktop and mobile applications.
Konva enables high performance animations, transitions, node nesting, layering, filtering, caching, event handling for desktop
and mobile applications, and much more.
You can draw things onto the stage, add event listeners to them, move them, scale them, and rotate them independently from other shapes to support high performance animations, even if your application uses thousands of shapes.
This project began as a GitHub fork of KineticJS.

大白话翻译:
Konva是一个H5 Canvas的JavaScript的框架,它通过为桌面和移动应用程序启用画布交互来扩展2d上下文。
Konva为桌面应用和移动应用程序提供高性能动画,过渡,节点嵌套,分层,过滤,缓存,事件处理等。
你可以将事物绘制到Stage上,向其添加事件侦听器,使用高性能动画对其进行移动,缩放以及从其他形状中独立旋转它们,即使你的应用程序使用数千种形状。
这个项目开始于KineticJS的GitHub分支。

 

二、官方地址
1: Konva官方地址:https://konvajs.org/
2: Konva的Github开源地址:https://github.com/konvajs/konva
3: Api文档:https://konvajs.org/docs/index.html
4:  vue-konva:https://github.com/konvajs/vue-konva
三、使用方法
在某个vue项目中使用了konva,但是没有使用vue-konva。因为vue-konva使用的是标签形式创建各图像组件,因为绘制的图形有点稍稍复杂,可能使用标签的形式不是很方便,还是在外写好再import的方式。

3.1 开始使用

两种方式引用,一种是通过npm instsall的方式;

npm install konva

另一种是使用script标签。

<script src="https://unpkg.com/[email protected]/konva.min.js"></script>

不同于其它框架,konva的id是绑定自一个div标签,而非canvas的id。当用stage绑定后会在该div下自行插入canvas标签。开始使用时需要创建一个stage,即承载各个层、组、图形的舞台;

<div id="container"> </div>

let stage = new Konva.Stage({
        container: 'container', //div的id
        width: width, //宽度
        height: height, //高度
      });

Konva提供了Rect、Circle、Ellipse、Wedge、Line、Sprite、Image、Text、TextPath、Star、Ring、Arc、Label、Path、RegularPolygon、Arrow、Custom等图形、图像和文字组件。基本每个图形的创建都是new Konva.Shape的方式,例如矩形:

let rect = new Konva.Rect({
		x: 30,
		y: 30,
		width: 150,
		height: 50,
		fill: 'red',
		stroke: 'black',
		strokeWidth: 2,
	});

添加完后需要往layer里添加,再把layer往stage里添加。但是一个stage里最好只有2-3层layer,因为一个每添加一个layer就会往绑定的div里插入一个canvas。加入canvas越多,渲染性能越差。同时控制台也会疯狂的弹警告。

Konva warning: The stage has x layers. Recommended maximum number of layers is 3-5. Adding more layers into the stage may drop the performance. Rethink your tree structure, you can use Konva.Group.

正确的做法是引入group,group可以创建多个,将需要加入的图形往group添加,再将group往layer里添加。即一个stage添加最多3-5层layer,一层layer可以添加多个group,一个group又可以添加多个shape。

 

let layer =  new Konva.Layer();
let group = new Konva.Group();
group.add(rect1);
layer.add(group);
stage.add(layer);

3.2 事件绑定

konva提供了多种事件绑定,包括mouseover, mouseout, mouseenter, mouseleave, mousemove, mousedown, mouseup, wheel, click, dblclick, dragstart, dragmove和dragend;可以给stage、layer、group和shape绑定事件。

//基本用法
target.on(eventName, function() {
	//todo
});

//给矩形绑定鼠标点击事件
//这个rect是上面3.1中创建的矩形
rect.on('click' function() {
	alert('rect被点击了');
});

3.3 图形拖拽

fabricjs框架创建出来的图形是默认可以拖拽编辑的,而konva则反其道而行之,默认创建的图形是不可拖拽,想要开启拖拽需要在创建时设置draggable为true,或者后面再进行setAttrs。同时还可以通过dragBoundFunc限制拖拽的范围。

let rect = new Konva.Rect({
		x: 30,
		y: 30,
		width: 150,
		height: 50,
		fill: 'red',
		draggable: true, //设置为可拖拽
		dragBoundFunc: function (pos) {
		  //设置只能横向拖拽
          return {
            x: pos.x,
            y: this.absolutePosition().y,
          };
        },
        
	});

3.4 动画

konva提供了动画,可以以单个图形展示动画,也可以group或其它形式一起展示动画。

//在X方向做来回运动
let centerX = stage.width() / 2;
let anim = new Konva.Animation(function (frame) {
        rect.x(
          100 * Math.sin((frame.time * 2 * Math.PI) / 2000) + centerX
        );
      }, layer);
      
anim.start();

//旋转90度
rect.to({ rotation:90, duration:1, easing: Konva.Easings.EaseIn, });

3.5 其它

除此之外,Konva还提供了更多的功能,比如多重选中、过滤器、补间动画等。具体可以参考相应的文档。

四、遇到问题
刚开始用时,没有看完文档,创建一个图形就添加一个layer,导致创建太多的layer,控制台会警告添加太多layer,后面查看标签元素,发现创建了很多个canvas标签。后面才知道了一个stage添加最多3-5层layer,一层layer可以添加多个group,一个group又可以添加多个shape。
同时,不要往layer或者stage里添加太多的内容,不然,会影响绘制效率。这种绘图在一定程度上是吃GPU,Win10下打开任务管理器会看到使用这些绘图框架都会让浏览器占用一定的GPU,特别是在老旧IE上占用尤为恐怖。
还要妥善维护创建的各图形,不然会引起内存泄漏,可以参考文档:https://konvajs.org/docs/performance/Avoid_Memory_Leaks.html

标签:layer,group,Konva,添加,绘图,konva,前端,stage
From: https://www.cnblogs.com/sttchengfei/p/17958133

相关文章

  • web前端css框架有哪些
    Laravel是一个流行的PHP框架,它具有出色的可测试性,可以帮助开发人员在更短的时间内编写可靠的代码。但是,即使使用了这个框架,也可能会出现测试覆盖率较低的情况。测试覆盖率是指代码中已由测试案例覆盖的部分比例。测试覆盖率越高,代码质量越高。在本文中,我们将分享几种技巧,帮助您提......
  • 使用React构造前端应用
    简单了解React和NodeReact是一个构建用户界面的JavaScript库,由Facebook开发,很流行,已被广泛使用。React基于组件构建,编写一段代码即可在多处复用,这很有优势。可以创建像Thumbnail、LikeButton和Video这样的组件,然后将它们组合成整个应用程序。React组件是JavaScript函数,学......
  • GLB 3d文件在前端页面的展示
                          GLB3d文件在前端页面的展示1. 选择方案前端实现3D效果的选项有以下四点:A. CSS3D技术;B. SVG;C. WebGL技术;D. Canvas或者图片模拟3D其中最后一种是用其他技术或方法去模拟3D效果,前3种才是浏览器真正意义上支持的3D技术。而three.j......
  • 基于 Docker 打造前端持续集成开发环境
    基于Docker打造前端持续集成开发环境写在前面:这不是一篇有新意的文章,因为这篇文章半年前我就发布在其他平台上过,为什么在知乎上旧文新发?除了想要把发布在其他地方的文章统一放到知乎上之外,还源于我最近在面试一些前端工程师时的一些疑惑,发现很多应聘高级前端岗的开发者对J......
  • QT:绘图
    QPainter能够实现绘制二维图形,适合用于绘制复杂度不高的固定图形,并且不能实现图项的选择、编辑、拖放、修改等交互功能对于需要绘制大量的、需要交互的图形,可以使用GraphicsViewItem QGraphicsEllipsetItem椭圆QGraphicsLineItem 直线QGraphicsPathItem......
  • 用 Socket.D 替代原生 WebSocket 做前端开发
    socket.d.js是基于websocket包装的socket.d协议的实现。就是用ws传输数据,但功能更强大。功能原生websocketsocket.d说明listen有有监听消息send有有发消息sendAndRequest无有发消息并接收一个响应(类似于http)sendAndSubscribe无有发消息......
  • LoRa SIP模块动能世纪XD6500S集成RF前端+LoRa无线电收发器SX1262
    相信大部分了解LoRa的朋友们都知道,LoRa是低功耗广域网通信技术中的一种,是Se***ch公司专有的一种基于扩频技术的超远距离无线传输技术。LoRaWAN是为LoRa远距离通信网络设计的一套通讯协议和系统架构。它是一种媒体访问控制(MAC)层协议。而我们今天的主角LoRaSIP模块动能世纪XD6500S......
  • 什么是前端开发中的 Clickjacking 风险
    Clickjacking(点击劫持)是一种网络安全威胁,它利用用户对于页面元素的信任来欺骗他们执行未经授权的操作。攻击者通过将恶意内容覆盖在看似正常的页面上,诱使用户误点击隐藏在其它元素上的按钮或链接,从而触发意外的操作。这种攻击通常通过透明的或半透明的图层来实现,用户在不知情的情况......
  • python diango后端支持运行脚本+vue前端支持脚本运行
    #使用Python内置的subprocess模块来执行Python脚本#使用注意:#1,依赖包需要提前导入至脚本中#2,script_path变量是脚本得绝对路径#3,filename变量是脚本得名称#搭配vue页面使用#想法:页面支持导入,编辑,执行脚本#导入:默认指定路径下,需要填......
  • Web3.0与虚拟现实:改变前端开发的新机遇
    Hello大家好!我是咕噜的铁蛋!。近年来,Web3.0和虚拟现实技术的兴起引起了广泛的关注和讨论。它们不仅在互联网领域带来了革命性的变化,同时也给前端开发者带来了全新的机遇和挑战。今天铁蛋讲和大家一起探讨Web3.0与虚拟现实如何改变前端开发,并带来了怎样的新机遇。一.Web3.0与虚拟现实......