当前位置: 首页 > news >正文

konvajs绘制带有透明度的多边形

Konva绘制带有透明度的多边形

先上效果图

Konva 是一个HTML5 Canvas JavaScript 框架,它通过对 2d context 的扩展实现了在桌面端和移动端的可交互性。Konva
提供了高性能的动画,补间,节点嵌套,布局,滤镜,缓存,事件绑定(桌面/移动端)等等功能。你可以使用 Konva
在舞台上绘制图形,给图形添加事件,移动、缩放和旋转图形并且支持高性能的动画即使包含数千个图形。

Konva工作原理

Konva 的对象是以一颗树的形式保存的,Konva.Stage 是树的根节点,Stage 子节点是用户创建的图层 Konva.Layer

每一个 layer 有两个 <canvas> 渲染器: 场景渲染器 和
图像命中检测渲染器。场景渲染器输出你所看见的内容,图像命中渲染器在隐藏的 canvas 里用于高性能的检测事件。

图层可以包含图形、嵌套图形的组、嵌套组的组。Stage(舞台),layers(图层),groups(组),和 shapes(图形)
都是虚拟节点,类似于 HTMLDOM 节点。

节点结构图:

安装

npm i Konva@9.3.14

注意版本我这里使用的是 "konva": "^9.3.14"

导入

import * as Konva from 'konva

konva 在v8.x.x 版本的时候已经支持模块化导入了,这里我还是整体导入

使用

<template>  <div class="canvasDiv"> <!-- 定义一个容器,用于放置canvas画布 -->  <div id="canvas" ref="canvasRef"></div> <!-- 定义canvas的DOM元素,并绑定一个ref引用 -->  </div>  
</template>  <script setup>  
import {nextTick, onMounted, onUnmounted, ref} from 'vue' // 导入Vue的响应式系统和方法  
import * as Konva from 'konva' // 导入Konva库,用于图形绘制  const canvasRef = ref() // 创建一个响应式引用,用于访问canvas DOM元素  function init() {  const layer = new Konva.Layer(); // 创建一个新的图层  const stage = new Konva.Stage({ // 创建一个舞台,并配置其容器、宽度和高度  container: 'canvas',  width: canvasRef.value.clientWidth,  height: canvasRef.value.clientHeight || 700,  });  stage.add(layer); // 将图层添加到舞台上  const customShape = new CustomShape({ // 创建一个自定义形状,并配置其属性  x:10,  y:10,  width:300,  height:400,  borderWidth: 4,  borderColor: "#FFFFFF",  });  layer.add(customShape) // 将自定义形状添加到图层上  layer.draw() // 绘制图层  
}  onMounted(() => { // 当组件挂载完成后执行  nextTick(() => { // 在DOM更新完成后执行  init() // 初始化画布  })  
})  class CustomShape extends Konva.Shape { // 定义一个继承自Konva.Shape的自定义形状类  constructor(config) {  super(config);  const {borderWidth, width, height} = config // 解构配置对象,获取边框宽度、宽度和高度  this.sceneFunc(context => { // 定义形状的绘制函数  // 绘制一个复杂的形状,包括多个线段和曲线  context.beginPath();  context.moveTo(0, 0); // 起点  // 绘制形状的各个部分  context.lineTo(width - width * 0.1, 0);  context.lineTo(width, width * 0.1);  context.lineTo(width, height);  context.lineTo(width * 0.35, height);  context.lineTo(width * 0.3, height + height * 0.1);  context.lineTo(width * 0.25, height);  context.lineTo(0, height);  context.lineTo(0, 0);  context.closePath();  // 创建并应用渐变填充  const gradient = context.createLinearGradient(0, 0, 0, this.getHeight());  gradient.addColorStop(0, 'rgba(255,219,57,0.82)');   gradient.addColorStop(1, 'rgba(255,140,0,0.2)');   context.fillStyle = gradient;  context.fill();  // 创建并应用渐变边框  const borderGradient = context.createLinearGradient(0, 0, 0, this.getHeight());  borderGradient.addColorStop(0, 'rgba(255,255,255,1)');   borderGradient.addColorStop(1, 'rgba(255,255,255,0.4)');   context.strokeStyle = borderGradient;  context.lineWidth = borderWidth;  context.stroke();  });  }  
}  
</script>  <style scoped>  
.canvasDiv{  width: 99vw; height: 50vh; background-image: url("/src/static/img/bg-1.png"); background-size: 100% 100%; position: relative; 
}  
</style>

主要的代码是CustomShape类实现的,CustomShape这个类又去继承了KonvaKonva.Shape 这个类

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【python】PyQt5中QRadioButton的详细用法教程与应用实战
  • 力扣-3232. 判断是否可以赢得数字游戏
  • Miniconda快速安装conda
  • 网络编程 --------- 2、socket网络编程接口
  • C++跳跃表个人理解
  • 如何设计一个测试用例
  • 计算两个时间之间有几个自然月
  • 量化小白也能自动化挖掘出6万+因子
  • 5分钟完成视频会议私有化部署
  • 类和对象的深入了解6
  • 【C语言】简易版扫雷游戏(数组、函数的练习)
  • 05-ArcGIS For JavaScript-RenderNode后处理效果
  • [012-1].第12节:Mysql的配置文件的使用
  • ubuntu安装workon
  • MyBatis缓存
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • Android框架之Volley
  • Apache的80端口被占用以及访问时报错403
  • CSS 专业技巧
  • echarts的各种常用效果展示
  • ES6 ...操作符
  • ES6之路之模块详解
  • node学习系列之简单文件上传
  • React-flux杂记
  • zookeeper系列(七)实战分布式命名服务
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 译米田引理
  • 译有关态射的一切
  • 原生Ajax
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #QT(智能家居界面-界面切换)
  • (13):Silverlight 2 数据与通信之WebRequest
  • (6)添加vue-cookie
  • (day 12)JavaScript学习笔记(数组3)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (五)activiti-modeler 编辑器初步优化
  • (转)使用VMware vSphere标准交换机设置网络连接
  • .net core + vue 搭建前后端分离的框架
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .net和jar包windows服务部署
  • .NET项目中存在多个web.config文件时的加载顺序
  • @vue/cli脚手架
  • [ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...
  • [2024-06]-[大模型]-[Ollama] 0-相关命令
  • [ACTF2020 新生赛]Upload 1
  • [Android Studio] 开发Java 程序