Konva 是什么?
Konva
是一个HTML5 Canvas JavaScript 框架,它通过对 2d context 的扩展实现了在桌面端和移动端的可交互性。Konva 提供了高性能的动画,补间,节点嵌套,布局,滤镜,缓存,事件绑定(桌面/移动端)等等功能。你可以使用 Konva 在舞台上绘制图形,给图形添加事件,移动、缩放和旋转图形并且支持高性能的动画即使包含数千个图形。
工作原理?
Konva 的对象是以一颗树的形式保存的,Konva.Stage
是树的根节点,Stage
子节点是用户创建的图层 (Konva.Layer
)。
每一个 layer 有两个 <canvas>
渲染器: 场景渲染器 和 图像命中检测渲染器。场景渲染器输出你所看见的内容,图像命中渲染器在隐藏的 canvas 里用于高性能的检测事件。
图层可以包含图形、嵌套图形的组、嵌套组的组。Stage
(舞台),layers
(图层),groups
(组),和 shapes
(图形) 都是虚拟节点,类似于 HTML 的 DOM 节点。
节点结构图:
Stage |
你可以对所有节点修改样式和变换。Konva
内建了很多图形,例如:rectangles, circles, images, sprites, text, lines, polygons, regular polygons, paths, stars等等,也可以通过实例化 Shape class 和自定义 draw function 创建自定义图形。
创建好了stage、layers 和 shapes 后,你就能进行绑定事件,变换节点,运行动画,添加滤镜等等操作了。
简单的例子:
// first we need to create a stage |
Result:
基本图形
Konva
支持的图形: Rect, Circle, Ellipse, Line, Polygon, Spline, Blob, Image, Text, TextPath, Star, Label, SVG Path, RegularPolygon.
自定义图形 custom shape:
var triangle = new Konva.Shape({ |
样式
图形支持的样式属性:
- Fill. Solid color, gradients or images
- Stroke (color, width)
- Shadow (color, offset, opacity, blur)
- Opacity
var pentagon = new Konva.RegularPolygon({ |
事件
你可以轻松的监听输入事件 (click
, dblclick
, mouseover
, tap
, dbltap
, touchstart
等等),attributes 变化事件 (scaleXChange
, fillChange
等等) 和 拖放事件(dragstart
, dragmove
)。
circle.on('mouseout touchend', function() { |
See working example.
拖放
Konva
内置对 drag 的支持,但没有对 drop
事件支持 (drop
, dragenter
, dragleave
, dragover
),但是你可以轻松的实现它们 via framework。
设置 draggable = true 启用拖放。
shape.draggable('true'); |
接下来你就可以订阅 drag&drop 事件和设置移动限制
滤镜
Konva
提供了多种滤镜:blur, invert, noise 等等。 详细请查看 滤镜API
示例:
动画
你可以通过两种方式创建动画:
通过
Konva.Animation
Demo:var anim = new Konva.Animation(function(frame) {
var time = frame.time,
timeDiff = frame.timeDiff,
frameRate = frame.frameRate;
// update stuff
}, layer);
anim.start();通过
Konva.Tween
Demo:var tween = new Konva.Tween({
node: rect,
duration: 1,
x: 140,
rotation: Math.PI * 2,
opacity: 1,
strokeWidth: 6
});
tween.play();
// or new shorter method:
circle.to({
duration : 1,
fill : 'green'
});
选择器
当你的开发大型应用时,选择器可以帮助你快速查找元素。你可以使用 find()
和 findOne
(返回找到的第一个)方法。
var circle = new Konva.Circle({ |
序列化 反序列化
所有创建的对象都能保存为 JSON 格式。你可以将它保存在服务端或者 LocalStorage。
var json = stage.toJSON(); |
你也可以通过 JSON 创建对象:
var json = '{"attrs":{"width":578,"height":200},"className":"Stage","children":[{"attrs":{},"className":"Layer","children":[{"attrs":{"x":100,"y":100,"sides":6,"radius":70,"fill":"red","stroke":"black","strokeWidth":4},"className":"RegularPolygon"}]}]}'; |
性能
Konva
提供了一些提升性能的工具。
主要的方法有:
- 缓存
Caching
允许你在 buffer canvas 里绘制元素,然后再通过 buffer canvas 绘制到场景,它能提升绘制复杂节点例如:文本、包含阴影或者描边的图形。
shape.cache(); |
- 图层
框架支持创建任意数量的<canvas>
。如果你的应用包含复杂的背景和许多可以移动的图形,你可以使用一个图层显示背景另外要给图层显示图形,从而只更新图形而不更新背景。Demo
查看所有提升性能的技巧 https://konvajs.org/docs/performance/All_Performance_Tips.html