啥是 Konva

Konva 是一个 canvas 库,可以让我们像操作 DOM 一样来操作 canvas,并提供了对 canvas 中元素的事件机制,拖放操作的支持。所以,用它来做一个拼图游戏什么的最合适了。此外,你也可以借助它来绘制一个页面的截图,作为大名鼎鼎的 html2canvas 库的替代方案,因为 html2canvas 在部分手机上生成截图的效果并不是很好。

容器,stage,layer,shape

在初始化 Konva 时需要调用 Konva.Stage 构造函数,并提供一个 div 作为容器:

var stage = new Konva.Stage({
container: 'container', // 容器 id
width: width,// canvas 宽度
height: height// canvas 高度
});

初始化 Stage 之后,我们就可以向 Stage 里面添加 layer 了:


var layer = new Konva.Layer();
stage.add(layer);

layer 的概念类似于 ps 中的图层,或者 DOM 中的 z-index,当我们向 stage 中添加一个 layer 时,DOM 中会再加入一个 canvas 元素来对应这个 layer。

shape 就是说我们可以在 layer 上画形状了,Konva 为我们提供了许多 shape,比如矩形,圆形,线段,图片,文字等,下面的代码在 layer 上画了一个矩形:


var rect = new Konva.Rect({
x: 10 ,
y: 10,
width: 100,
height: 100,
fill: 'blue'
})

当我们往 layer 中添加了多个 shape 时,调用 layer.draw 时,layer 会按照形状添加的先后顺序依次进行绘制。后面添加的在上面,最先添加的在最下面。

See the Pen LaBjOY by imgss
(@imgss) on CodePen.

到这里我们大概知道 Konva 的元素结构了,以下是官方给出的元素树图:

              Stage
|
+------+------+
| |
Layer Layer
| |
+-----+-----+ Shape
| |
Group Group
| |
+ +---+---+
| | |
Shape Group Shape
|
+
|
Shape

这里我们还没有了解过 group,下面我们介绍一下 group。

group

group 类似于 ps 中的组,当把几个形状添加到 group 时,移动或者旋转 group 时,group 中的形状会整体发生变化, 上面的三个矩形就构成了一个 group,我们把 group 的 draggable 属性设为 true,当移动 group 时,三个矩形都会发生移动。

var group = new Konva.Group({
x: 120,
y: 40,
draggable: true,
rotation: 20
}); var colors = ['red', 'orange', 'yellow']; for(var i = 0; i < 3; i++) {
var box = new Konva.Rect({
x: i * 30,
y: i * 18,
width: 100,
height: 50,
name: colors[i],
fill: colors[i],
stroke: 'black',
strokeWidth: 4
}); group.add(box);
}
layer.add(group);

当使用 group 时,group 中元素的位置(x,y)是相对于 group 的位置进行定位的,而不再相对于 layer。

group 的嵌套

值得注意的是,group 中还可以嵌套 group,下面是一个 demo:


var parentGroup = new Konva.Group({
x: 180,
y: 200
});
var childGroup = new Konva.Group({
x: 0,
y: 10
});
var circle = new Konva.Circle({
x: 10,
y: 10,
radius: 20,
fill: 'green'
});
childGroup.add(circle);
parentGroup.add(childGroup);
layer.add(parentGroup);

shape的变换

我们可以借助 Konva.Transformer 来简单的对 shape 进行变换操作,Konva.Transformer其实是一类特殊的 Group。它在 Group 的基础上提供了用于对鼠标的动作进行响应的 UI。不过官网提示这一功能还在实验阶段,我们一起来看一下。

使用 transformer 可以通过以下三步:

  1. 创建一个 Transformer 实例
  2. 将这个实例加入到 layer 中
  3. 通过实例的transformer.attachTo(node)方法绑定到一个形状或者 group 上即可。
//创建一个 star
var star = new Konva.Star({
x: stage.width() / 2,
y: stage.height() / 2,
draggable: true,
numPoints: 5,
innerRadius: 20,
outerRadius: 40,
fill: 'yellow',
stroke: 'black',
strokeWidth: 4
}); // 创建一个 transformer
var transformer = new Konva.Transformer(); layer.add(transformer); //将 transformer 绑定到 star 上
transformer.attachTo(star); layer.add(star);

See the Pen PLBQMV by imgss
(@imgss) on CodePen.

元素树结构的遍历

Konva 提供了类似于 jQuery 的 find 方法来找到你想找的元素,find 方法可以在 stage,layer,group,shape 上调用,你也可以使用 findOne 来只选择一个元素。

find方法支持的选择器如下:

// 选中所有id 为 rect 的元素

var rectangle = new Konva.Rect({x: 0, y: 0, id: 'rect', ...})
stage.find('#rect');
// 选中所有 name 为 circle 的元素
var rectangle = new Konva.Rect({x: 0, y: 0, name: 'circle', ...})
stage.find('.circle'); // 选中所有Star
stage.find('Star'); // 选中所有的Star 和 Rectangle
stage.find('Shape');

需要说明的是:这里的 id 不具有唯一性,多个元素可以具有同一个 id,且选择时会选到多个元素。

参考:https://konvajs.org/docs/

Konva入门教程的更多相关文章

  1. wepack+sass+vue 入门教程(三)

    十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...

  2. wepack+sass+vue 入门教程(二)

    六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...

  3. wepack+sass+vue 入门教程(一)

    一.安装node.js node.js是基础,必须先安装.而且最新版的node.js,已经集成了npm. 下载地址 node安装,一路按默认即可. 二.全局安装webpack npm install ...

  4. Content Security Policy 入门教程

    阮一峰文章:Content Security Policy 入门教程

  5. gulp详细入门教程

    本文链接:http://www.ydcss.com/archives/18 gulp详细入门教程 简介: gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行优 ...

  6. UE4新手引导入门教程

    请大家去这个地址下载:file:///D:/UE4%20Doc/虚幻4新手引导入门教程.pdf

  7. ABP(现代ASP.NET样板开发框架)系列之2、ABP入门教程

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之2.ABP入门教程 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...

  8. webpack入门教程之初识loader(二)

    上一节我们学习了webpack的安装和编译,这一节我们来一起学习webpack的加载器和配置文件. 要想让网页看起来绚丽多彩,那么css就是必不可少的一份子.如果想要在应用中增加一个css文件,那么w ...

  9. 转载:TypeScript 简介与《TypeScript 中文入门教程》

    简介 TypeScript是一种由微软开发的自由和开源的编程语言.它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程.安德斯·海尔斯伯格,C#的首席架构 ...

随机推荐

  1. C#动态操作DataTable(新增行、列、查询行、列等)

    public void CreateTable() { //创建表 DataTable dt = new DataTable(); //1.添加列 dt.Columns.Add("Name& ...

  2. Dubbo2.6.5入门——简单的HelloWorld

    建立父工程 打开idea,新建一个空的maven工程,作为整个项目的父工程. <?xml version="1.0" encoding="UTF-8"?& ...

  3. Go语言系列(三)- 基础函数和流程控制

    一.strings和strconv的使用 1. strings.HasPrefix(s string, prefix string) bool:判断字符串s是否以prefix开头 . 2. strin ...

  4. 《从Paxos到ZooKeeper分布式一致性原理与实践》学习笔记

    第一章 分布式架构 1.1 从集中式到分布式 集中式的特点: 部署结构简单(因为基于底层性能卓越的大型主机,不需考虑对服务多个节点的部署,也就不用考虑多个节点之间分布式协调问题) 分布式系统是一个硬件 ...

  5. [Luogu P3295][SCOI 2016]萌萌哒

    先说下暴力做法,如果[l1,r1]和[l2,r2]子串相等等价于两个区间内每个数对应相等.那么可以用并查集暴力维护,把对应相等的数的位置维护到同一个集合里去,最后答案其实就是把每个集合可以放的数个数乘 ...

  6. [数学笔记Mathematical Notes]2-一个带对数的积分不等式

    定理. $$\bex \int_0^1\frac{\ln^2x}{x^x}\rd x<2\int_0^1 \frac{\rd x}{x^x}. \eex$$ 证明: 由分部积分及 Fubini ...

  7. 用juery的ajax方法调用aspx.cs页面中的webmethod方法

    首先在 aspx.cs文件里建一个公开的静态方法,然后加上WebMethod属性. 如: [WebMethod] public static string GetUserName() { //.... ...

  8. Python 入门基础14 --time、os、random、json、pickle 常用模块1

    今日内容: 一.常用模块 2019.04.10 更新 1.time:时间 2.calendar:日历 3.datetime:可以运算的时间 4.sys:系统 5.os:操作系统 6.os.path:系 ...

  9. 编程入门视频【 Python、PHP、ThinkPHP、Laravel、Mysql、微信小程序】

    免费分享 Python.PHP.ThinkPHP.Laravel.Mysql.微信小程序等学习视频 点击进入搜刮 免费分享 Python.PHP.ThinkPHP.Laravel.Mysql.微信小程 ...

  10. LabVIEW--使用云端编译器编译多个vi

    使用ni 云服务器编译vi 详细请看链接: https://users.niwsc.com/compilecloud/#/ http://www.ni.com/white-paper/52328/en ...