首页 > 其他分享 >前端使用 Konva 实现可视化设计器(4)

前端使用 Konva 实现可视化设计器(4)

时间:2024-04-11 22:36:35浏览次数:28  
标签:code selectingNodesAreaMove render Konva 可视化 selectionTool offset speed 前端

上一章做一个补充,就是实现通过上下左右按键移动所选节点。

继续求 Star ,希望大家多多一键三连,十分感谢大家的支持~

创作不易,Star 50 个,创作加速!

github源码

gitee源码

示例地址

通过按键移动节点

image

准备工作

给 SelectionTool 添加两个必要的方法:

  // 更新已选位置
  selectingNodesAreaMove(offset: Konva.Vector2d) {
    this.selectingNodesArea?.x(this.selectingNodesArea.x() + offset.x)
    this.selectingNodesArea?.y(this.selectingNodesArea.y() + offset.y)
  }

  // 更新节点位置
  selectingNodesMove(offset: Konva.Vector2d) {
    for (const node of this.render.selectionTool.selectingNodes) {
      node.x(node.x() + offset.x)
      node.y(node.y() + offset.y)
    }
  }

根据上一章的设计,选中一个/多个节点的时候,还会伴随一个 group 作为辅助,所以我们除了移动所选节点的同时,还需要移动 selectingNodesArea。

按键控制,就是需要处理 dom 的 keydown 和 keyup 两个事件,放在 KeyMoveHandlers 文件中,这里是核心代码:

      keydown: (e: GlobalEventHandlersEventMap['keydown']) => {
        if (!e.ctrlKey) {
          if (
            Object.values(Types.MoveKey)
              .map((o) => o.toString())
              .includes(e.code)
          ) {
            if (e.code === Types.MoveKey.上) {
              this.render.selectionTool.selectingNodesAreaMove({ x: 0, y: -this.speed })
              this.render.selectionTool.selectingNodesMove({ x: 0, y: -this.speed })
            } else if (e.code === Types.MoveKey.左) {
              this.render.selectionTool.selectingNodesAreaMove({ x: -this.speed, y: 0 })
              this.render.selectionTool.selectingNodesMove({ x: -this.speed, y: 0 })
            } else if (e.code === Types.MoveKey.右) {
              this.render.selectionTool.selectingNodesAreaMove({ x: this.speed, y: 0 })
              this.render.selectionTool.selectingNodesMove({ x: this.speed, y: 0 })
            } else if (e.code === Types.MoveKey.下) {
              this.render.selectionTool.selectingNodesAreaMove({ x: 0, y: this.speed })
              this.render.selectionTool.selectingNodesMove({ x: 0, y: this.speed })
            }

            if (this.speed < this.speedMax) {
              this.speed++
            }
          }
        }
      },
      keyup: () => {
        this.speed = 1
      }

这里设计的规则是,按一下移动 1 像素,按着不动则会按 1 像素增速移动,松开按键则恢复原来速度。

接下来,计划实现下面这些功能:

  • 放大缩小所选的“磁贴效果”(基于网格)
  • 拖动所选的“磁贴效果”(基于网格)
  • 节点层次单个、批量调整
  • 键盘复制、粘贴
  • 等等。。。

是不是更加有趣呢?是不是值得更多的 Star 呢?勾勾手指~

源码

gitee源码

示例地址

标签:code,selectingNodesAreaMove,render,Konva,可视化,selectionTool,offset,speed,前端
From: https://www.cnblogs.com/xachary/p/18130149

相关文章

  • pdf在前端网页的显示
    背景:react框架实现插件:pdfjs-dist:"^2.0.943"  (还有其他插件  react-pdf, react-pdf-js,pdf.js都可以尝试一下呢)实现效果:实现代码如下:index.jsximportReact,{useState,useEffect}from'react';import{Spin}from'antd';import{RightOutlined,L......
  • 前端纯原生js数据监控,更新视图
    还没完善好,先记录一部分 binding.js//定义Model类,用于存储数据和监听数据变化functionModel(value=""){this._value=value;//存储数据的值this._listeners=[];//存储监听数据变化的函数}//定义Model类的set方法,用于设置数据的值Model.prototype.set......
  • 使用L7·蚂蚁地理空间数据可视化实现灯杆查看
     1<template>2<divv-if="showMapDialog">3<el-dialogtitle="查看灯杆分布":visible="visible"@close="closeDia">4<divid="map"></div>5</el-dialo......
  • 数据可视化-ECharts Html项目实战(11)
    在之前的文章中,我们学习了如何在ECharts中特殊图表的双y图以及自定义形状词云图。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。数据可视化-EChartsHtml项目实战(10)-CSDN博客文章浏览阅读775次,点赞20次,收藏16次......
  • 社交圈子系统,包含Uni前端源码 ,App+H5+小程序 ,后端thinkphp源码+商业版
    系统介绍系统基于TP6+Uni-app框架开发;客户移动端采用uni-app开发,管理后台TH6开发。系统支持微信公众号端、微信小程序端、H5端、PC端多端账号同步,可快速打包生成APP;我们为你准备了完善的后台管理,不需要你懂PHP,按照教程10分钟安装完即可使用,堪比深夜的杜蕾斯还方便。......
  • 基于python数据爬取和可视化
    系统介绍本系统介绍了一个基于基于Python的电影数据爬取和可视化技术的研究和方案设计,采用Python语言和Django架构构建。通过网络爬虫爬取豆瓣电影评论数据,利用数据清洗和处理技术,建立了一个全面的电影信息数据库。使用Python中强大的数据处理库进行统计分析,常见的一些库panda......
  • (二)网页前端开发基础之HTML
    HTML是一种在因特网上常见的网页制作标注性语言,但因缺少程序设计语言所应有的特征,不能算作一种程序设计语言。它通过浏览器的翻译将网页中的内容呈现给用户。对于网站设计人员,HTLM和CSS是一起用的,它俩的关系是“内容”和“形式”,由HTML确定网页的内容,CSS实现页面的表现形式。两......
  • uniapp 2.0可视化开发工具:提升跨平台应用开发效率的新篇章(更新版)
    摘要随着移动应用市场的不断扩大和前端技术的飞速发展,开发者们对于快速、高效构建跨平台应用的需求日益增强。uniapp作为一款优秀的跨平台应用开发框架,凭借其强大的功能和易用的特性,赢得了广大开发者的青睐。,其2.0版本的发布为开发者带来了更多的便利和可能性。其中,可视化开发......
  • 前端学习-vue视频学习015-其他API
    尚硅谷视频教程shallowRefshallowReactive浅层次的响应式数据(仅第一层)shallowRef:只能整体修改person.value可以修改,但是person.value.name无法修改shallowReactive:只能修改对象的第一层数据car.brand可以修改,但是car.options.color无法修改主要用处在于:如果数据量非常......
  • 前端使用 Konva 实现可视化设计器(3)
    github/giteeStar终于有几个了!从这章开始,难度算是(或者说细节较多)升级,是不是值得更多的Star呢?!继续求Star,希望大家多多一键三连,十分感谢大家的支持~创作不易,Star50个,创作加速!github源码gitee源码示例地址选择框准备工作想要拖动一个元素,可以考虑使用节点的drag......