Konva

  • 一、介绍
  • 二、官方地址
  • 三、使用方法
  • 四、遇到问题
  • 五、使用感受

一、介绍

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分支。

简单来说,Konva同fabricjs类似,是一个2d的canvas绘图框架框架。其以stage、layer、group的分层分组方式实现层级绘图,并以组件化的方式管理绘图,提供事件监听器和高性能动画。


二、官方地址

  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/konva@7.0.3/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的idwidth: 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

#mermaid-svg-P6zJzSW53DufEDO0 .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-P6zJzSW53DufEDO0 .label text{fill:#333}#mermaid-svg-P6zJzSW53DufEDO0 .node rect,#mermaid-svg-P6zJzSW53DufEDO0 .node circle,#mermaid-svg-P6zJzSW53DufEDO0 .node ellipse,#mermaid-svg-P6zJzSW53DufEDO0 .node polygon,#mermaid-svg-P6zJzSW53DufEDO0 .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-P6zJzSW53DufEDO0 .node .label{text-align:center;fill:#333}#mermaid-svg-P6zJzSW53DufEDO0 .node.clickable{cursor:pointer}#mermaid-svg-P6zJzSW53DufEDO0 .arrowheadPath{fill:#333}#mermaid-svg-P6zJzSW53DufEDO0 .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-P6zJzSW53DufEDO0 .flowchart-link{stroke:#333;fill:none}#mermaid-svg-P6zJzSW53DufEDO0 .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-P6zJzSW53DufEDO0 .edgeLabel rect{opacity:0.9}#mermaid-svg-P6zJzSW53DufEDO0 .edgeLabel span{color:#333}#mermaid-svg-P6zJzSW53DufEDO0 .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-P6zJzSW53DufEDO0 .cluster text{fill:#333}#mermaid-svg-P6zJzSW53DufEDO0 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-P6zJzSW53DufEDO0 .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-P6zJzSW53DufEDO0 text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-P6zJzSW53DufEDO0 .actor-line{stroke:grey}#mermaid-svg-P6zJzSW53DufEDO0 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-P6zJzSW53DufEDO0 .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-P6zJzSW53DufEDO0 #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-P6zJzSW53DufEDO0 .sequenceNumber{fill:#fff}#mermaid-svg-P6zJzSW53DufEDO0 #sequencenumber{fill:#333}#mermaid-svg-P6zJzSW53DufEDO0 #crosshead path{fill:#333;stroke:#333}#mermaid-svg-P6zJzSW53DufEDO0 .messageText{fill:#333;stroke:#333}#mermaid-svg-P6zJzSW53DufEDO0 .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-P6zJzSW53DufEDO0 .labelText,#mermaid-svg-P6zJzSW53DufEDO0 .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-P6zJzSW53DufEDO0 .loopText,#mermaid-svg-P6zJzSW53DufEDO0 .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-P6zJzSW53DufEDO0 .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-P6zJzSW53DufEDO0 .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-P6zJzSW53DufEDO0 .noteText,#mermaid-svg-P6zJzSW53DufEDO0 .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-P6zJzSW53DufEDO0 .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-P6zJzSW53DufEDO0 .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-P6zJzSW53DufEDO0 .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-P6zJzSW53DufEDO0 .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-P6zJzSW53DufEDO0 .section{stroke:none;opacity:0.2}#mermaid-svg-P6zJzSW53DufEDO0 .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-P6zJzSW53DufEDO0 .section2{fill:#fff400}#mermaid-svg-P6zJzSW53DufEDO0 .section1,#mermaid-svg-P6zJzSW53DufEDO0 .section3{fill:#fff;opacity:0.2}#mermaid-svg-P6zJzSW53DufEDO0 .sectionTitle0{fill:#333}#mermaid-svg-P6zJzSW53DufEDO0 .sectionTitle1{fill:#333}#mermaid-svg-P6zJzSW53DufEDO0 .sectionTitle2{fill:#333}#mermaid-svg-P6zJzSW53DufEDO0 .sectionTitle3{fill:#333}#mermaid-svg-P6zJzSW53DufEDO0 .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-P6zJzSW53DufEDO0 .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-P6zJzSW53DufEDO0 .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-P6zJzSW53DufEDO0 .grid path{stroke-width:0}#mermaid-svg-P6zJzSW53DufEDO0 .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-P6zJzSW53DufEDO0 .task{stroke-width:2}#mermaid-svg-P6zJzSW53DufEDO0 .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-P6zJzSW53DufEDO0 .taskText:not([font-size]){font-size:11px}#mermaid-svg-P6zJzSW53DufEDO0 .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-P6zJzSW53DufEDO0 .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-P6zJzSW53DufEDO0 .task.clickable{cursor:pointer}#mermaid-svg-P6zJzSW53DufEDO0 .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-P6zJzSW53DufEDO0 .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-P6zJzSW53DufEDO0 .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-P6zJzSW53DufEDO0 .taskText0,#mermaid-svg-P6zJzSW53DufEDO0 .taskText1,#mermaid-svg-P6zJzSW53DufEDO0 .taskText2,#mermaid-svg-P6zJzSW53DufEDO0 .taskText3{fill:#fff}#mermaid-svg-P6zJzSW53DufEDO0 .task0,#mermaid-svg-P6zJzSW53DufEDO0 .task1,#mermaid-svg-P6zJzSW53DufEDO0 .task2,#mermaid-svg-P6zJzSW53DufEDO0 .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-P6zJzSW53DufEDO0 .taskTextOutside0,#mermaid-svg-P6zJzSW53DufEDO0 .taskTextOutside2{fill:#000}#mermaid-svg-P6zJzSW53DufEDO0 .taskTextOutside1,#mermaid-svg-P6zJzSW53DufEDO0 .taskTextOutside3{fill:#000}#mermaid-svg-P6zJzSW53DufEDO0 .active0,#mermaid-svg-P6zJzSW53DufEDO0 .active1,#mermaid-svg-P6zJzSW53DufEDO0 .active2,#mermaid-svg-P6zJzSW53DufEDO0 .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-P6zJzSW53DufEDO0 .activeText0,#mermaid-svg-P6zJzSW53DufEDO0 .activeText1,#mermaid-svg-P6zJzSW53DufEDO0 .activeText2,#mermaid-svg-P6zJzSW53DufEDO0 .activeText3{fill:#000 !important}#mermaid-svg-P6zJzSW53DufEDO0 .done0,#mermaid-svg-P6zJzSW53DufEDO0 .done1,#mermaid-svg-P6zJzSW53DufEDO0 .done2,#mermaid-svg-P6zJzSW53DufEDO0 .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-P6zJzSW53DufEDO0 .doneText0,#mermaid-svg-P6zJzSW53DufEDO0 .doneText1,#mermaid-svg-P6zJzSW53DufEDO0 .doneText2,#mermaid-svg-P6zJzSW53DufEDO0 .doneText3{fill:#000 !important}#mermaid-svg-P6zJzSW53DufEDO0 .crit0,#mermaid-svg-P6zJzSW53DufEDO0 .crit1,#mermaid-svg-P6zJzSW53DufEDO0 .crit2,#mermaid-svg-P6zJzSW53DufEDO0 .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-P6zJzSW53DufEDO0 .activeCrit0,#mermaid-svg-P6zJzSW53DufEDO0 .activeCrit1,#mermaid-svg-P6zJzSW53DufEDO0 .activeCrit2,#mermaid-svg-P6zJzSW53DufEDO0 .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-P6zJzSW53DufEDO0 .doneCrit0,#mermaid-svg-P6zJzSW53DufEDO0 .doneCrit1,#mermaid-svg-P6zJzSW53DufEDO0 .doneCrit2,#mermaid-svg-P6zJzSW53DufEDO0 .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-P6zJzSW53DufEDO0 .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-P6zJzSW53DufEDO0 .milestoneText{font-style:italic}#mermaid-svg-P6zJzSW53DufEDO0 .doneCritText0,#mermaid-svg-P6zJzSW53DufEDO0 .doneCritText1,#mermaid-svg-P6zJzSW53DufEDO0 .doneCritText2,#mermaid-svg-P6zJzSW53DufEDO0 .doneCritText3{fill:#000 !important}#mermaid-svg-P6zJzSW53DufEDO0 .activeCritText0,#mermaid-svg-P6zJzSW53DufEDO0 .activeCritText1,#mermaid-svg-P6zJzSW53DufEDO0 .activeCritText2,#mermaid-svg-P6zJzSW53DufEDO0 .activeCritText3{fill:#000 !important}#mermaid-svg-P6zJzSW53DufEDO0 .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-P6zJzSW53DufEDO0 g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-P6zJzSW53DufEDO0 g.classGroup text .title{font-weight:bolder}#mermaid-svg-P6zJzSW53DufEDO0 g.clickable{cursor:pointer}#mermaid-svg-P6zJzSW53DufEDO0 g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-P6zJzSW53DufEDO0 g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-P6zJzSW53DufEDO0 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-P6zJzSW53DufEDO0 .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-P6zJzSW53DufEDO0 .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-P6zJzSW53DufEDO0 .dashed-line{stroke-dasharray:3}#mermaid-svg-P6zJzSW53DufEDO0 #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-P6zJzSW53DufEDO0 #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-P6zJzSW53DufEDO0 #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-P6zJzSW53DufEDO0 #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-P6zJzSW53DufEDO0 #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-P6zJzSW53DufEDO0 #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-P6zJzSW53DufEDO0 #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-P6zJzSW53DufEDO0 #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-P6zJzSW53DufEDO0 .commit-id,#mermaid-svg-P6zJzSW53DufEDO0 .commit-msg,#mermaid-svg-P6zJzSW53DufEDO0 .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-P6zJzSW53DufEDO0 .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-P6zJzSW53DufEDO0 .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-P6zJzSW53DufEDO0 g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-P6zJzSW53DufEDO0 g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-P6zJzSW53DufEDO0 g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-P6zJzSW53DufEDO0 g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-P6zJzSW53DufEDO0 g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-P6zJzSW53DufEDO0 g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-P6zJzSW53DufEDO0 .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-P6zJzSW53DufEDO0 .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-P6zJzSW53DufEDO0 .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-P6zJzSW53DufEDO0 .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-P6zJzSW53DufEDO0 .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-P6zJzSW53DufEDO0 .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-P6zJzSW53DufEDO0 .edgeLabel text{fill:#333}#mermaid-svg-P6zJzSW53DufEDO0 .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-P6zJzSW53DufEDO0 .node circle.state-start{fill:black;stroke:black}#mermaid-svg-P6zJzSW53DufEDO0 .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-P6zJzSW53DufEDO0 #statediagram-barbEnd{fill:#9370db}#mermaid-svg-P6zJzSW53DufEDO0 .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-P6zJzSW53DufEDO0 .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-P6zJzSW53DufEDO0 .statediagram-state .divider{stroke:#9370db}#mermaid-svg-P6zJzSW53DufEDO0 .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-P6zJzSW53DufEDO0 .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-P6zJzSW53DufEDO0 .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-P6zJzSW53DufEDO0 .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-P6zJzSW53DufEDO0 .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-P6zJzSW53DufEDO0 .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-P6zJzSW53DufEDO0 .note-edge{stroke-dasharray:5}#mermaid-svg-P6zJzSW53DufEDO0 .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-P6zJzSW53DufEDO0 .error-icon{fill:#522}#mermaid-svg-P6zJzSW53DufEDO0 .error-text{fill:#522;stroke:#522}#mermaid-svg-P6zJzSW53DufEDO0 .edge-thickness-normal{stroke-width:2px}#mermaid-svg-P6zJzSW53DufEDO0 .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-P6zJzSW53DufEDO0 .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-P6zJzSW53DufEDO0 .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-P6zJzSW53DufEDO0 .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-P6zJzSW53DufEDO0 .marker{fill:#333}#mermaid-svg-P6zJzSW53DufEDO0 .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-P6zJzSW53DufEDO0 {color: rgba(0, 0, 0, 0.75);font: ;}

stage
layer1
layer2
layer3
group1
group2
group3
...
groupN
shape1
....
shapeN
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


五、使用感受

与fabricjs相比,感觉konva更加强化了层级的概念,将绘图分为了layer和下一级的group。这样可以往每一层级或者组更加灵活的添加内容。此外,还要注意往其中添加内容数量,不然会导致绘图效率的下降。

Konva-前端绘图框架,轻松进行分层绘制相关推荐

  1. 便捷的前端绘图框架:two.js初探

    附:two.js做的小栗子 1.two.js用来做动画十分便捷,因为two.js制作的动画默认都是以自己为中心旋转 3.two.js的旋转不会造成累加效果 2. Two.js中不使用定时器,使用Two ...

  2. 前端绘图开源组件_5 个优秀前端 UI 框架

    随着 Web 技术的不断发展,前端开发框架层出不穷,各有千秋,今天小编为大家奉上前端 UI 框架的开源项目,希望大家能够喜欢!如果大家有 UI 框架相关的开源项目,也可以托管到码云上,我们会及时给予推 ...

  3. 前端绘图开源组件_推荐10款常用的高质量的Web前端UI开源框架,必收藏

    Web前端领域最近几年发展的特别迅速,可以说是百家争鸣.Web前端框架就是为了节约开发成本和时间,一般开发一个项目都会用到前端框架(除非自己有前端开发团队).对于现在的开发者来说,都向着全栈方向发展, ...

  4. 耗时1年的前端技术框架切换之旅

    本文分享自华为云社区<记一次难忘的前端技术框架切换之旅[WEB前端大作战]>,原文作者:一颗白菜 . 一.旅行之始 2020年初,某个普通的工作日,正在聚精会神"搞事情" ...

  5. 视频教程-WebGL 可视化3D绘图框架:Three.js 零基础上手实战-其他

    WebGL 可视化3D绘图框架:Three.js 零基础上手实战 网名风舞烟,中国科技大学计算机专业.微软认证讲师(MCE).微软数据分析讲师.10多年软件行业从业经验,参与过数百万的企业级ERP系统 ...

  6. vue 前端商城框架_前端工程师要掌握几个Vue框架

    vue是一套用于构建用户界面的渐进式JavaScript框架,简单说Vue是类似于view的前端框架. vue开发核心是关注视图层,同时它更加容易与第三方库结合,再者我们在现有的项目中可以直接整合一起 ...

  7. iOS绘图框架CoreGraphics分析

    由于CoreGraphics框架有太多的API,对于初次接触或者对该框架不是十分了解的人,在绘图时,对API的选择会感到有些迷茫,甚至会觉得iOS的图形绘制有些繁琐.因此,本文主要介绍一下iOS的绘图 ...

  8. 前端三大框架Angular React Vue

    前端三大框架:Angular[Google]:一套框架,多种平台移动端 & 桌面端.学会用Angular构建应用,然后把这些代码和能力复用在多种多种不同平台的应用上 -- Web.移动 Web ...

  9. ❤️《Vue前端基础框架集合从入门到高级》(小白也可学,建议收藏)❤️

    <Vue前端基础框架集合从入门到高级>,小白也可学 文章目录 <Vue前端基础框架集合从入门到高级>,小白也可学 ❤️一.前端核心分析 ❤️1.1.概述 ❤️1.2.前端三要素 ...

最新文章

  1. mybatis的执行流程
  2. 用ASP.NET AJAX框架扩展HTML Map控件
  3. java 过滤掉相同请求_java并发访问重复请求过滤问题
  4. 7宗命案,潜逃23年,大数据还是认出了她
  5. HTML-参考手册: HTML 音频/视频
  6. Luogu P1963 [NOI2009]变换序列(二分图匹配)
  7. C# 一些不注意知识点:命名空间,等级,class等等
  8. 40天后Java 11将推出的功能有哪些,它们与Java 9和10的不同之处是什么?
  9. PHP使用GD库绘制一个机器猫
  10. html左侧浮动广告代码,纯js网页浮动广告代码
  11. 调出鲜艳水彩日式油画风景照片的PS教程
  12. SSM整合尚硅谷Spring
  13. filezilla,怎么下载filezilla
  14. 从零到熟悉,带你掌握Python len() 函数的使用
  15. TCP缓冲区大小及限制
  16. CNN与句子分类之动态池化方法DCNN--模型介绍篇
  17. Win 10装机量占据全球台式机总量的5%
  18. mysql 鼠标右键无法使用_笔记本电脑鼠标右键无反应怎么办
  19. 给麦田PT做的新主题:Harvest
  20. 基于uni-app+uni ui考勤打卡H5项目 定位打卡,日历打卡记录,考勤记录,绩效(地图位置)等

热门文章

  1. oracle 大于当天时间_oracle中时间格式时候的大于号是大于和等于的意思
  2. eclipse溢出解决
  3. jvm crash 的原因以及解决办法
  4. 大学生金融小白自学Python做量化投资需要注意哪些?
  5. 安卓 使用配置教程 微信公众号关注:娄叫兽
  6. c语言编写一个四舍五入的函数,C语言题指教关于四舍五入的问题请编写一个函 – 手机爱问...
  7. Modbus 协议学习笔记及常用功能码详解
  8. Flink与Kafka版本对应关系
  9. Eclipse与MyEclipse简介
  10. eviews面板数据的操作