canva框架之konva.js的使用说明

什么是knova?

Konva 是一个HTML5 Canvas JavaScript框架,可以让我们像操作DOM 一样来操作 canvas,并提供了对 canvas 中元素的事件机制,拖放操作的支持。

它通过为桌面和移动应用程序启用Canvas交互性来扩展2d上下文。

Konva支持高性能动画、转换、节点嵌套、分层、过滤、缓存、桌面和移动应用程序的事件处理等等。

您可以在舞台上绘制东西,向它们添加事件侦听器,移动它们,缩放它们,并独立于其他形状旋转它们,以支持高性能动画,即使您的应用程序使用了数千个形状。所以,用它来做一个拼图游戏什么的最合适了。

knova的使用


直接通过npm安装

npm install konva

直接引入

<script src="https://unpkg.com/konva@3.2.4/konva.min.js"></script>

直接下载

https://unpkg.com/konva@3.2.4/konva.js


knova的术语说明

先看官方给出的元素树图:



首先我们将整个视图看做一个舞台stage,而舞台中的每一个层,看做layer,layer里面可以有多个group组,我们在group中绘制图案放入图片等等。

knova的步骤

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

var stage = new Konva.Stage({

container: '#container', // id名字为container的盒子作为容器

width: width,// canvas 宽度

height: height// canvas 高度

});

说明:container属性里面的值,就是我们的容器名字。


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

var layer = new Konva.Layer();

stage.add(layer); //将舞台添加到容器中

说明:我们通过add函数将我们的层添加到舞台中。

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

shape可以理解为我们在layer上面的形状,knova为我们提供了很多内置的形状,比如矩形,圆形,线段,图片,文字等,比如我们通过下面的代码在layer 上画了一个矩形:

var rect = new Konva.Rect({

x: 10 ,

y: 10,

width: 100,

height: 100,

fill: 'blue'

})

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

layer.draw(); //绘制层

注意:后面添加的会显示在上面,最先添加的显示在最下面。

主要代码为:

<div id="mycanvas">

</div>

<script>

//创建一个舞台

var stage = new Konva.Stage({

container:'#mycanvas', //将id为mycanvas的盒子作为我们的画布

width:window.innerWidth, //设置宽度

height:window.innerHeight //设置高度

})

//创建一个层

var layer1 = new Konva.Layer();

// 将层添加到舞台

stage.add(layer1);

//创建一个shape-比如矩形

var rect1 = new Konva.Rect({

x: 100, //矩形相对父容器的坐标

y: 100,

width: 500, //矩形的宽高

height: 50,

strokeWidth: 10, //描边的宽度

stroke: '#aaa', //描边的颜色

cornerRadius: 25 //圆角

})

//将shape添加到层中

layer1.add(rect1);

//绘制层

layer1.draw();

</script>

在这里的示例里面并没有用到组的概念,那么在下面的实际示例里面将会给大家介绍到组的概念。

实际示例-进度条

方法1:

<div id="mycanvas">

</div>

<script>

//创建一个舞台

var stage = new Konva.Stage({

container:'#mycanvas', //将id为mycanvas的盒子作为我们的画布

width:window.innerWidth, //设置宽度

height:window.innerHeight //设置高度

})

//创建一个层

var layer1 = new Konva.Layer();

// 将层添加到舞台

stage.add(layer1);

//创建一个shape-比如矩形

var rect1 = new Konva.Rect({

x: 100, //矩形相对父容器的坐标

y: 100,

width: 500, //矩形的宽高

height: 50,

strokeWidth: 10, //描边的宽度

stroke: '#aaa', //描边的颜色

cornerRadius: 25 //圆角

});

//创建一个shape-比如里面的圆角矩形

var rect2 = new Konva.Rect({

x: 100, //矩形相对父容器的坐标

y: 100,

width: 200, //矩形的宽高

height: 50,

strokeWidth: 10, //描边的宽度

stroke: '#aaa', //描边的颜色

fill:'red', //填充颜色

cornerRadius: 25 //圆角

})

//将shape添加到层中

layer1.add(rect1);

layer1.add(rect2);

//绘制层

layer1.draw();

</script>

说明:按照步骤4的说明,直接再新建一个圆角矩形,然后添加到对应的层里面,绘制图形就能实现。但是并没有用到group相应的概念,如果我们用到group的话,应该怎么做呢?那么我们来看看方法2吧!

方法二:

<div id="mycanvas">

</div>

<script>

//创建一个舞台

var stage = new Konva.Stage({

container:'#mycanvas', //将id为mycanvas的盒子作为我们的画布

width:window.innerWidth, //设置宽度

height:window.innerHeight //设置高度

})

//创建一个层

var layer1 = new Konva.Layer();

// 将层添加到舞台

stage.add(layer1);

//新增的内容-新建一个组

var group = new Konva.Group({

x : 0, //设置组的坐标

y : 0

});

//创建一个shape-比如矩形

var rect1 = new Konva.Rect({

x: 100, //矩形相对父容器的坐标

y: 100,

width: 500, //矩形的宽高

height: 50,

strokeWidth: 10, //描边的宽度

stroke: '#aaa', //描边的颜色

cornerRadius: 25 //圆角

});

//创建一个shape-比如里面的圆角矩形

var rect2 = new Konva.Rect({

x: 100, //矩形相对父容器的坐标

y: 100,

width: 200, //矩形的宽高

height: 50,

strokeWidth: 10, //描边的宽度

stroke: '#aaa', //描边的颜色

fill:'red', //填充颜色

cornerRadius: 25 //圆角

})

//把两个矩形添加到组中

group.add(rect1);

group.add(rect2);

//将组添加到层中

layer1.add(group);

//绘制层

layer1.draw();

</script>

说明:大家应该已经看到group组的作用了吧,其实在组的位置为x=0,y=0的时候,和组内形状单个添加到层的样子是一样的,只是组的移动会造成组内所有元素的移动。

这个案例看着是不是有点无聊呢?我们来看看如果我想要实现动态的应该怎么做呢?

var tween = new Konva.Tween({

node: rect2, //要进行动画的Konva对象的名字

width: 300, //要进行动画的属性

opacity: 0.8,

duration: 3, //持续时间

easing: Konva.Easings.EaseIn, //动画的动画效果

yoyo: false, //是否进行循环播放的设置

onFinish: function () {

//动画执行结束后,执行此方法

}

});

tween.play(); //启动动画


注意:要进行动态改变的属性,它的初始值和最终值应该是不一样的哦!


那么还有其他的方式么?我们可以通过to函数

rect2.to({

x: 100,

y: 100,

width:300,

opactity: .1,

duration: 3,

onFinish: function() {

}

});


说明:to函数里面的属性应该是我们要改变的属性,然后要注意yoyo属性不写的情况下,默认动画只执行一次。


好啦,现在基本已经入门了吧,那么下一次的文章呢,我们会将knova里面常用的形状以及常用的属性介绍给大家哦,敬请期待吧!

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 【四、Canvas开发库封装】 《4.1封装常用的绘制函数》 4.1.1封装一个矩形 //思考:我们用到的矩形需要...
    夜幕小草阅读 4,961评论 2 5
  • 一:canvas简介 1.1什么是canvas? ①:canvas是HTML5提供的一种新标签 ②:HTML5 ...
    GreenHand1阅读 4,882评论 2 32
  • 一、canvas简介 1.1 什么是canvas?(了解) 是HTML5提供的一种新标签 Canvas是一个矩形区...
    J_L_L阅读 1,695评论 0 4
  • 一、Unity简介 1. Unity界面 Shift + Space : 放大界面 Scene界面按钮渲染模式2D...
    MYves阅读 8,668评论 0 22
  • 渐变的面目拼图要我怎么拼? 我是疲乏了还是投降了? 不是不允许自己坠落, 我没有滴水不进的保护膜。 就是害怕变得面...
    闷热当乘凉阅读 4,502评论 0 13

友情链接更多精彩内容