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

举报
敬 之 发表于 2022/04/16 00:56:54 2022/04/16
【摘要】 目录 一、Konva 基本概念 二、Konva 的使用 1. 引入 Konva 2. Konva 基本绘制步骤 三、Konva 动画 1. tween 对象 2. 动画 to 方法的使用 3. 循环播放动画 四、案例:使用 Konva 绘制进度条 一、Konva 基本概念    &n...

目录

一、Konva 基本概念

二、Konva 的使用

1. 引入 Konva

2. Konva 基本绘制步骤

三、Konva 动画

1. tween 对象

2. 动画 to 方法的使用

3. 循环播放动画

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


一、Konva 基本概念

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

  • 轻量,使用方便,可适用于 PC 端和移动端;
  • 支持丰富的事件处理操作;
  • 支持类似于 jQuery 的操作方式;
  • 开源,可以随意更改;
  • 性能好。

Konva 中文文档 中文APIKonva Konvajs 中文文档, Konva 是一个HTML5 Canvas JavaScript 框架,它通过对 2d context 的扩展实现了在桌面端和移动端的可交互性。提供了高性能的动画,补间,节点嵌套,布局,滤镜,缓存,事件绑定(桌面/移动端)等等功能.http://konvajs-doc.bluehymn.com/        在 Konva 的使用中,整个视图可以看成一个舞台 stage,舞台中可以有多个层次 layer,每一层下面又可以有各种形状或者很多组 group,组下面也可以有分组或各种各样的形状 shape,如下示意图:

二、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


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

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


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

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


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

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


  
  1. layer.add(rect); //将图形添加至层
  2. layer.draw(); //将层渲染到舞台

接下来我们结合以上步骤使用 Konva 绘制一个矩形:


  
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>使用konva库制作一个矩形</title>
  6. <style></style>
  7. <!-- 引入Konva包 -->
  8. <script src="https://unpkg.com/konva@4.0.0/konva.min.js"></script>
  9. </head>
  10. <body>
  11. <!-- 放置舞台 -->
  12. <div id="container"></div>
  13. </body>
  14. <script>
  15. //1.创建舞台
  16. var stage = new Konva.Stage({
  17. container: 'container',
  18. width: window.innerWidth, //宽高(全屏)
  19. height: window.innerHeight,
  20. })
  21. //2.创建层
  22. var layer = new Konva.Layer();
  23. //3.将层添加至舞台
  24. stage.add(layer);
  25. //4.创建矩形
  26. var rect = new Konva.Rect({
  27. x: 100, //起始坐标
  28. y: 100,
  29. width: 200, //宽高
  30. height: 100,
  31. scaleX: 1.3,
  32. scaleY: 1.3,
  33. draggable: true,
  34. fill: 'red' //填充
  35. })
  36. //5.将矩形添加至层
  37. layer.add(rect);
  38. //6.将层渲染至舞台
  39. layer.draw();
  40. </script>
  41. </html>

效果如下:

三、Konva 动画

1. tween 对象

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

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


  
  1. var tween = new Konva.Tween({
  2. node: rect, //要使用动画的Konva对象
  3. x: 300,
  4. y:300,
  5. rotation: 360, //旋转
  6. duration: 1, //持续时间
  7. easing: Konva.Easings.EaseIn, //动画效果
  8. yoyo: true, //是否进行循环播放
  9. ......
  10. onFinish: function() { //动画执行结束后,执行此方法
  11. }
  12. });
  13. 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{ } 创建相关属性即可。

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

效果如下:

3. 循环播放动画

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

如下简单案例:


  
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>konva动画</title>
  6. <style>
  7. body {
  8. padding: 0;
  9. margin: 0;
  10. background-color: bisque;
  11. overflow: hidden;
  12. }
  13. </style>
  14. <!-- 引入Konva包 -->
  15. <script src="https://unpkg.com/konva@4.0.0/konva.min.js"></script>
  16. </head>
  17. <body>
  18. <!-- 放置舞台 -->
  19. <div id="container"></div>
  20. </body>
  21. <script>
  22. //创建舞台
  23. var stage = new Konva.Stage({
  24. container: 'container',
  25. width: window.innerWidth, //宽高(全屏)
  26. height: window.innerHeight,
  27. })
  28. //创建层
  29. var layer = new Konva.Layer();
  30. //将层添加至舞台
  31. stage.add(layer);
  32. //创建矩形
  33. var rect = new Konva.Rect({
  34. x: 250,
  35. y: 250,
  36. width: 100,
  37. height: 100,
  38. fill: 'red'
  39. });
  40. layer.add(rect);
  41. layer.draw();
  42. //tween为矩形添加动画
  43. var tween = new Konva.Tween({
  44. node: rect, //要进行动画的Konva对象
  45. x: 100,
  46. y: 100,
  47. rotation: 360, //旋转360度
  48. opactity: .1,
  49. easing: Konva.Easings.Linear, //动画效果
  50. duration: 2, //持续时间
  51. yoyo: true, //是否进行循环播放
  52. onFinish: function () {
  53. //动画执行结束后执行此方法
  54. this.reset(); //重置动画
  55. this.play(); //播放动画
  56. }
  57. });
  58. tween.play(); //启动动画
  59. </script>
  60. </html>

效果如下:

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

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


  
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>使用konva库制作一个进度条</title>
  6. <style>
  7. body {
  8. padding: 0;
  9. margin: 0;
  10. background-color: bisque;
  11. overflow: hidden;
  12. }
  13. </style>
  14. <!-- 引入Konva包 -->
  15. <script src="https://unpkg.com/konva@4.0.0/konva.min.js"></script>
  16. </head>
  17. <body>
  18. <!-- 放置舞台 -->
  19. <div id="container"></div>
  20. </body>
  21. <script>
  22. //创建舞台
  23. var stage = new Konva.Stage({
  24. container: 'container',
  25. width: window.innerWidth, //宽高(全屏)
  26. height: window.innerHeight,
  27. })
  28. //创建层
  29. var layer = new Konva.Layer();
  30. //将层添加至舞台
  31. stage.add(layer);
  32. //设置中心点
  33. var centerX = stage.width() / 2;
  34. var centerY = stage.height() / 2;
  35. var x = 1 / 8 * stage.width();
  36. var y = centerY;
  37. var height = 1 / 12 * stage.height();
  38. var maxWidth = 3 / 4 * stage.width()
  39. //绘制进度条
  40. //内部矩形
  41. var innerRect = new Konva.Rect({
  42. x: x,
  43. y: y,
  44. width: 100,
  45. height: height,
  46. opacity: 0.8, //透明度
  47. fill: '#149985',
  48. cornerRadius: height / 2, //圆角
  49. });
  50. //将内部矩形添加至层
  51. layer.add(innerRect);
  52. //外部矩形
  53. var outerRect = new Konva.Rect({
  54. x: x,
  55. y: y,
  56. width: maxWidth,
  57. height: height,
  58. stroke: 'blue',
  59. strokeWidth: 2,
  60. cornerRadius: height / 2,
  61. });
  62. //将外部矩形添加至层
  63. layer.add(outerRect);
  64. //为内部矩形添加动画效果
  65. innerRect.to({
  66. width: maxWidth, //内部矩宽度变为最大宽度
  67. duration: 1.4, //动画持续时间
  68. easing: Konva.Easings.StrongEaseInOut,
  69. })
  70. //将层渲染至舞台
  71. layer.draw();
  72. </script>
  73. </html>

案例效果:


三篇文章速通 canvas:

➡️ 第一部分:canvas介绍,绘制圆形、矩形;
➡️ 第二部分:绘制文字、图片、坐标系,canva颜色和样式,绘制环境;
➡️ 第三部分:canvas库Konva.js的使用。

文章来源: majinjian.blog.csdn.net,作者:Developer 小马,版权归原作者所有,如需转载,请联系作者。

原文链接:majinjian.blog.csdn.net/article/details/123073115

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。