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

konva.js 工具类

konva.js 工具类

class KonvaCanvas {/*** 初始化画布* @param {String} domId 容器dom id*/constructor(domId) {this.layer = null;this.stage = null;this.scale = 1;this.init(domId);}/*** 聚焦到指定元素* @param {String} elementId 元素dom id*/focusOn(elementId) {if (!this.layer || !this.stage || !elementId) return;var element = this.stage.find("#" + elementId)[0];console.log(element.position());let x = this.stage.width() * 0.5 - element.position().x;let y = this.stage.height() * 0.5 - element.position().y;this.stage.x(x);this.stage.y(y);// this.layer.draw();}/*** 绘制图片* @param {String} url 图片路径* @param {String} id 唯一标识* @param {Number} x 横坐标* @param {Number} y 纵坐标* @param {Number} zoom 缩放比例* @param {Number} rotate 旋转角度*/drawImage(url, id, x = 0, y = 0, zoom = 1.0, rotate = 0) {return new Promise((resolve, reject) => {var img = new Image();img.src = url;const that = this;img.onload = function () {const img_w = img.width * zoom;const img_h = img.height * zoom;var kImage = new Konva.Image({image: img,x: x,y: y,width: img_w,height: img_h,offset: {// offset的设置是使得围绕中心旋转x: img_w / 2,y: img_h / 2,},id: id,});kImage.rotate(rotate);that.layer.add(kImage);// that.layer.draw();console.log("图片加载完成");that.layer.batchDraw(); //重绘resolve(kImage);};});}/*** 更新元素属性信息* @param {String} id 元素id* @param {Object} attr 元素属性 {}*/updateElement(id, attr) {if (!this.layer || !this.stage) return;var shape = this.stage.find("#" + id)[0];shape.setAttrs(attr);this.layer.draw();}/*** 绘制线* @param {Array} points 点位坐标   [x1, y1, x2, y2, x3, y3]* @param {String} id 唯一标识* @param {Number} lineWidth 线宽* @param {String} color 颜色* @returns*/drawLine(points, id, lineWidth = 1, color = "#ffffff") {if (!this.layer) return;var line = new Konva.Line({points: points || [],stroke: color,strokeWidth: lineWidth,lineCap: "round",lineJoin: "round",tension: 0.5,id: id,});this.layer.add(line);}/*** 销毁画布*/destroyed() {if (this.layer) {this.layer.destroyChildren();this.layer.draw();}}// ==========================================  私有方法init(domId) {if (!domId) {return;}const container = document.getElementById(domId);var width = container.clientWidth;var height = container.clientHeight;var stage = new Konva.Stage({container: domId,width: width,height: height,draggable: true,});var layer = new Konva.Layer();stage.add(layer);this.stage = stage;this.layer = layer;this.stage.on("wheel", e => {const direction = e.evt.deltaY > 0 ? -0.1 : 0.1;this.scale = this.scale + direction;this.stage.scaleX(this.scale);this.stage.scaleY(this.scale);this.stage.getPointerPosition();// this.layer.draw();// this.stage.draw();this.layer.batchDraw(); //重绘});}// ==========================================  私有方法 end
}export default KonvaCanvas;
http://www.lryc.cn/news/339502.html

相关文章:

  • php未能在vscode识别?
  • 解读MongoDB官方文档获取mongo7.0版本的安装步骤与基本使用
  • 【数据结构|C语言版】顺序表
  • Unity类银河恶魔城学习记录12-17 p139 In game UI源代码
  • MongoDB学习【一】MongoDB简介和部署
  • html 引入vue Element ui 的方式
  • 曾经备受追捧的海景房,为何如今却没人要了?
  • [docker] 镜像部分补充
  • Android(Kotlin) 委托(by) 封装 SharedPreferences
  • 2022年蓝桥杯省赛软件类C/C++B组----积木画
  • Python数据挖掘项目开发实战:使用朴素贝叶斯进行社会媒体挖掘
  • 【DM8】ET SQL性能分析工具
  • 001-谷粒商城-微服务剖析
  • vue实现前端打印效果
  • android wifi直连 wifip2pmanager
  • 伸缩应用程序和执行滚动更新
  • 解决WPS右键菜单冗余选项,去除WPS右键菜单选项
  • 部署ELFK+zookeeper+kafka架构
  • ActiveMQ 任意文件上传漏洞复现
  • k8s实践总结
  • 前端从零到一搭建脚手架并发布到npm
  • 使用 git 提交项目到 github
  • SRE 与传统 IT 运营有何不同?
  • html公众号页面实现点击按钮跳转到导航
  • 【算法】快速排序的基本思想、优化 | 挖坑填补法和区间分割法
  • OSPF动态路由实验(华为)
  • EasyRecovery2024专业免费的电脑数据恢复软件
  • Vue集成PageOffice实现在线编辑word、excel(前端配置)
  • IBM SPSS Statistics for Mac:数据分析的卓越工具
  • python爬虫------- Selenium下篇(二十三天)