H5画布 canvas(三)canvas 库 Konva.js 的使用

简介: H5画布 canvas(三)canvas 库 Konva.js 的使用

一、Konva 基本概念

       Konva.js,全称适用于桌面/移动端应用的 HTML5 2d canvas 库,是一个HTML5 Canvas JavaScript 框架,它提供了高性能的动画,补间,节点嵌套,布局,滤镜,缓存,事件绑定(桌面/移动端)等等功能。你可以使用 Konva 在舞台上绘制图形,给图形添加事件,移动、缩放和旋转图形并且支持高性能的动画即使包含数千个图形。Konva 具有以下特点:


轻量,使用方便,可适用于 PC 端和移动端;

支持丰富的事件处理操作;

支持类似于 jQuery 的操作方式;

开源,可以随意更改;

性能好。

Konva 中文文档 中文API

Konva Konvajs 中文文档, Konva 是一个HTML5 Canvas JavaScript 框架,它通过对 2d context 的扩展实现了在桌面端和移动端的可交互性。提供了高性能的动画,补间,节点嵌套,布局,滤镜,缓存,事件绑定(桌面/移动端)等等功能.

http://konvajs-doc.bluehymn.com/

       在 Konva 的使用中,整个视图可以看成一个舞台 stage,舞台中可以有多个层次 layer,每一层下面又可以有各种形状或者很多组 group,组下面也可以有分组或各种各样的形状 shape,如下示意图:

image.png



二、Konva 的使用

1. 引入 Konva

       在我们的项目中使用 Konva 前需要先引入 .js 包,可以通过 <script> 标签在线引入,也可以从 CDN 下载至本地后引入;


在线引入:


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

从 CDN 下载官网 Konva.js 包:


Konva.js 完整版


Konva.js 压缩版


2. Konva 基本绘制步骤

(1)创建一个具有 id 名的 div,用于放置舞台;

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

(2)创建舞台 stage

var stage = new Konva.Stage({
    container: 'container', //指定放置舞台的容器
    width: window.innerWidth, //设置宽高
    height: window.innerHeight,
  })

(3)创建层 layer 并将层添加至舞台;

var layer = new Konva.Layer(); //创建层 layer
stage.add(layer); //将层添加至舞台

(4)创建要绘制的图形(此处以矩形为例);

var rect = new Konva.Rect({ //创建矩形
    x: 100,
    y: 100,
    opactity: 0.5,
    draggable: true,
    fill: 'red'
    //其余相关属性...
  })

(5)将创建的形状添加至层并将层渲染到舞台中;


layer.add(rect); //将图形添加至层
layer.draw(); //将层渲染到舞台
接下来我们结合以上步骤使用 Konva 绘制一个矩形:
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>使用konva库制作一个矩形</title>
  <style></style>
  <!-- 引入Konva包 -->
  <script src="https://unpkg.com/konva@4.0.0/konva.min.js"></script>
</head>
<body>
  <!-- 放置舞台 -->
  <div id="container"></div>
</body>
<script>
  //1.创建舞台
  var stage = new Konva.Stage({
    container: 'container',
    width: window.innerWidth, //宽高(全屏)
    height: window.innerHeight,
  })
  //2.创建层
  var layer = new Konva.Layer();
  //3.将层添加至舞台
  stage.add(layer);
  //4.创建矩形
  var rect = new Konva.Rect({
    x: 100, //起始坐标
    y: 100,
    width: 200, //宽高
    height: 100,
    scaleX: 1.3,
    scaleY: 1.3,
    draggable: true,
    fill: 'red' //填充
  })
  //5.将矩形添加至层
  layer.add(rect);
  //6.将层渲染至舞台
  layer.draw();
</script>
</html>

效果如下:

image.png



三、Konva 动画

1. tween 对象

       使用动画时必须先实例化 Konva.tween 对象创建补间动画,然后执行 play() 运行动画;tween 是控制 Konva 对象进行动画的核心对象,它可以控制所有数字类型的属性进行动画处理,比如:x, y, rotation, width, height, radius, strokeWidth, opacity, scaleX 等。


如下是一个基本的 tween 创建动画的例子:

var tween = new Konva.Tween({
    node: rect, //要使用动画的Konva对象
    x: 300,
    y:300,
    rotation: 360, //旋转
    duration: 1, //持续时间
    easing: Konva.Easings.EaseIn, //动画效果
    yoyo: true, //是否进行循环播放
    ......
    onFinish: function() { //动画执行结束后,执行此方法
    }
});
tween.play(); //启动动画

除用 play() 方法启动动画之外,tween 还有以下参数可供使用:


tween.play();播放动画

tween.pause();暂停动画

tween.reverse();动画逆播放

tween.reset();重置动画

tween.finish();立即结束动画

动画的效果也有多种:


Konva.Easings.Linear;线性

Konva.Easings.EaseIn;缓动,先慢后快

Konva.Easings.EaseOut;先快后慢

Konva.Easings.EaseInOut;两头慢,中间快

Konva.Easings.BackEaseIn;往回一点,然后往前冲

Konva.Easings.BackEaseOut

Konva.Easings.BackEaseInOut

Konva.Easings.ElasticEaseIn;橡皮筋

Konva.Easings.ElasticEaseOut

Konva.Easings.ElasticEaseInOut

Konva.Easings.BounceEaseIn;弹跳

Konva.Easings.BounceEaseOut

Konva.Easings.BounceEaseInOut

Konva.Easings.StrongEaseIn;强力

Konva.Easings.StrongEaseOut

Konva.Easings.StrongEaseInOut


2. 动画 to 方法的使用

       在实际的开发过程中,如果每次使用动画都先实例化 Konva.tween,在 play() 启动动画,这样是很麻烦的,而且效率不高。而 Konva 也为开发者提供了更为简便的方式,那就是 to,to 其实就是对 tween 的封装。


在使用 to 时我们不必再去实例化 Konva.tween 对象,直接在需要添加动画的对象后面 .to{ } 创建相关属性即可。


如下是使用动画的两种方式对比:

image.png

效果如下:

image.png



3. 循环播放动画

       循环播放主要是结合 tween 配合 onFinish 事件中的 reset()重置动画 和 play()播放动画,达到循环播放的效果。


如下简单案例:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>konva动画</title>
  <style>
    body {
      padding: 0;
      margin: 0;
      background-color: bisque;
      overflow: hidden;
    }
  </style>
  <!-- 引入Konva包 -->
  <script src="https://unpkg.com/konva@4.0.0/konva.min.js"></script>
</head>
<body>
  <!-- 放置舞台 -->
  <div id="container"></div>
</body>
<script>
  //创建舞台
  var stage = new Konva.Stage({
    container: 'container',
    width: window.innerWidth, //宽高(全屏)
    height: window.innerHeight,
  })
  //创建层
  var layer = new Konva.Layer();
  //将层添加至舞台
  stage.add(layer);
  //创建矩形
  var rect = new Konva.Rect({
    x: 250,
    y: 250,
    width: 100,
    height: 100,
    fill: 'red'
  });
  layer.add(rect);
  layer.draw();
  //tween为矩形添加动画
  var tween = new Konva.Tween({
    node: rect, //要进行动画的Konva对象
    x: 100,
    y: 100,
    rotation: 360, //旋转360度
    opactity: .1,
    easing: Konva.Easings.Linear, //动画效果
    duration: 2, //持续时间
    yoyo: true, //是否进行循环播放
    onFinish: function () {
      //动画执行结束后执行此方法
      this.reset(); //重置动画
      this.play(); //播放动画
    }
  });
  tween.play(); //启动动画
</script>
</html>

效果如下:

image.png


四、案例:使用 Konva 绘制进度条

       具体思路就是:绘制一个外部矩形,一个内部矩形,再为内部矩形添加动画,宽度由 0 变为外部矩形的宽度。


<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>使用konva库制作一个进度条</title>
  <style>
    body {
      padding: 0;
      margin: 0;
      background-color: bisque;
      overflow: hidden;
    }
  </style>
  <!-- 引入Konva包 -->
  <script src="https://unpkg.com/konva@4.0.0/konva.min.js"></script>
</head>
<body>
  <!-- 放置舞台 -->
  <div id="container"></div>
</body>
<script>
  //创建舞台
  var stage = new Konva.Stage({
    container: 'container',
    width: window.innerWidth, //宽高(全屏)
    height: window.innerHeight,
  })
  //创建层
  var layer = new Konva.Layer();
  //将层添加至舞台
  stage.add(layer);
  //设置中心点
  var centerX = stage.width() / 2;
  var centerY = stage.height() / 2;
  var x = 1 / 8 * stage.width();
  var y = centerY;
  var height = 1 / 12 * stage.height();
  var maxWidth = 3 / 4 * stage.width()
  //绘制进度条
  //内部矩形
  var innerRect = new Konva.Rect({
    x: x,
    y: y,
    width: 100,
    height: height,
    opacity: 0.8, //透明度
    fill: '#149985',
    cornerRadius: height / 2, //圆角
  });
  //将内部矩形添加至层
  layer.add(innerRect);
  //外部矩形
  var outerRect = new Konva.Rect({
    x: x,
    y: y,
    width: maxWidth,
    height: height,
    stroke: 'blue',
    strokeWidth: 2,
    cornerRadius: height / 2,
  });
  //将外部矩形添加至层
  layer.add(outerRect);
  //为内部矩形添加动画效果
  innerRect.to({
    width: maxWidth, //内部矩宽度变为最大宽度
    duration: 1.4, //动画持续时间
    easing: Konva.Easings.StrongEaseInOut,
  })
  //将层渲染至舞台
  layer.draw();
</script>
</html>

案例效果:

image.png



三篇文章速通 canvas:


➡️ 第一部分:canvas介绍,绘制圆形、矩形;

➡️ 第二部分:绘制文字、图片、坐标系,canva颜色和样式,绘制环境;

➡️ 第三部分:canvas库Konva.js的使用。


相关文章
|
23天前
|
移动开发 前端开发 JavaScript
使用JavaScript和Canvas进行绘图
Canvas是HTML5的绘图工具,借助JavaScript实现网页上的图形、图像及动画创作。通过Canvas元素和2D渲染上下文,开发者能绘制图形、处理图像、制作动画,甚至用于游戏开发。基本步骤包括获取Canvas元素、设置绘图属性、绘制形状、处理图像以及实现动画。同时,注意性能优化,如减少不必要的重绘和使用Web Workers。Canvas结合WebGL还能实现3D效果,与Web Audio API结合则能做音频可视化。分享你的Canvas经验,探讨更多创意应用!
16 0
|
6天前
|
数据可视化 前端开发 JavaScript
前端框架与库-D3.js数据可视化基础
【7月更文挑战第21天】D3.js是Web开发中创建动态、交互图表的利器,适用于从基础条形图到复杂地理热力图的广泛需求。核心概念涉及数据绑定至DOM,支持动态更新。初学者常遇难题包括不当数据绑定、选择器误用、过渡动画过量及坐标轴配置失误。避免策略需善用`.data()`, `.enter().append()`, `.exit().remove()`管理数据,熟知选择器差异,适度应用`.transition()`, 并精准设定坐标轴。示例条形图代码展示了数据绑定至`&lt;rect&gt;`元素的过程,奠定基础,助你进阶复杂项目。
|
13天前
|
缓存 JavaScript 前端开发
前端框架与库 - Vue.js基础:模板语法、数据绑定
【7月更文挑战第14天】Vue.js 是渐进式框架,以简洁API和高效数据绑定知名。本文聚焦模板语法与数据绑定,解释常见问题和易错点,助力初学者避坑。模板语法中,{{ expression }} 用于渲染值,v-bind/: 用于动态绑定属性。数据绑定涉及文本、属性和事件,注意v-model适用于表单元素,计算属性有缓存。理解正确用法,借助文档和IDE,可提升开发质量和效率。善用Vue.js,打造响应式UI。
|
12天前
|
JavaScript 前端开发 API
前端框架与库 - Vue.js 组件与路由
【7月更文挑战第15天】Vue.js 框架以简洁API和高效DOM更新著名,组件和路由是构建应用的关键。组件是自包含的实例,常见问题包括命名冲突、作用域混淆和状态管理。要避免这些问题,可使用命名空间、明确数据绑定和事件,以及采用Vuex管理状态。Vue Router提供声明式路由,常见挑战包括路由守卫、动态路由参数和懒加载配置。正确使用路由守卫、处理动态参数和实现代码分割能优化路由管理。提供的代码示例展示了基本组件和路由配置。
|
16天前
|
前端开发 JavaScript 安全
JavaScript进阶-JavaScript库与框架简介
【7月更文挑战第11天】JavaScript库和框架加速Web开发,但也带来挑战。选择适合项目、团队技能的库或框架,如React、Angular、Vue,是关键。保持依赖更新,注意性能优化,避免过度依赖。遵循最佳实践,确保安全性,如防XSS和CSRF。学习基础,结合代码示例(如React计数器组件),提升开发效率和应用质量。
|
19天前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的试题库管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的试题库管理系统附带文章源码部署视频讲解等
24 1
|
22天前
|
资源调度 JavaScript 前端开发
JavaScript进阶 - JavaScript库与框架简介
【7月更文挑战第5天】JavaScript库和框架构成了前端开发的核心,如jQuery简化DOM操作,Angular、React和Vue提供全面解决方案。选择时要明确需求,避免过度工程化和陡峭学习曲线。使用版本管理工具确保兼容性,持续学习以适应技术变化。示例展示了jQuery和React的简单应用。正确选择和使用这些工具,能提升开发效率并创造优秀Web应用。
|
12天前
|
存储 资源调度 前端开发
JavaScript 使用axios库发送 post请求给后端, 给定base64格式的字符串数据和一些其他参数, 使用表单方式提交, 并使用onUploadProgress显示进度
使用 Axios 发送包含 Base64 数据和其他参数的 POST 请求时,可以通过 `onUploadProgress` 监听上传进度。由于整个请求体被视为一个单元,所以进度可能不够精确,但可以模拟进度反馈。前端示例代码展示如何创建一个包含 Base64 图片数据和额外参数的 `FormData` 对象,并在上传时更新进度条。后端使用如 Express 和 Multer 可处理 Base64 数据。注意,实际进度可能不如文件上传精确,显示简单加载状态可能更合适。
|
25天前
|
移动开发 JavaScript
thinkPHP5.0开发微信H5页面分享接口signature验证失败,signature与微信 JS 接口签名校验工具返回结果不一致
thinkPHP5.0开发微信H5页面分享接口signature验证失败,signature与微信 JS 接口签名校验工具返回结果不一致
39 0
|
1月前
|
JavaScript 前端开发
程序技术好文:第一百三十八节,JavaScript,封装库
程序技术好文:第一百三十八节,JavaScript,封装库
12 0