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

antv x6让拖拽控件工具箱悬浮在画布上,工具箱区域鼠标按下不生成节点

项目需求是让工具箱悬浮在画布上,而我们拖拽控件生成节点是Mousedown鼠标按下时就触发的,所以每次我们按下鼠标(拖拽或者单击)都会生成节点,这也就导致我们在工具箱单击时会在工具箱下边生成节点

在这里插入图片描述

写了好多方法,比如mousedown加时间戳同时开启dnd.start拖拽,等到生成节点的时候在validateNode里使用时间间隔判断啊,又或者在mousedown的时候记录一个标志,在Mouseup的时候清除一个标志,延迟多少毫秒再判断标志是否还在,如果还在,证明是拖拽事件再触发dnd.start,但是这两种方法都试了,都有些问题,最后,大佬提示,可以用如下方法实现:

继承Dnd,重写isInsideValidArea方法,把方法改成只要拖拽的节点不离开工具箱区域,就不会在画布上生成节点

dnd类的源码
源码里只定义了验证鼠标是否在可拖拽区域中的方法(自己分析的,反正大概就这么个意思吧哈哈哈哈,如有不对还请各位大佬温柔指正~)

 protected isInsideValidArea(p: Point.PointLike) {
    let targetRect: Rectangle
    const targetGraph = this.targetGraph
    const targetScroller = this.targetScroller

    if (targetScroller) { // 判断是否支持滚动
      if (targetScroller.options.autoResize) { // 如果支持滚动判断是否是否自动扩充/缩小画布
        targetRect = this.getDropArea(targetScroller.container)
      } else {
        const outter = this.getDropArea(targetScroller.container)
        targetRect = this.getDropArea(targetGraph.container).intersectsWithRect( // 返回画布区域与滚动区域相交的区域
          outter,
        )!
      }
    } else {
      targetRect = this.getDropArea(targetGraph.container)
    }

    return targetRect && targetRect.containsPoint(p) // 返回是否有可拖拽区域与当前鼠标(代表节点)是否在此区域中,如果有就生成节点
  }

  protected getDropArea(elem: Element) { // 返回可拖拽区域的x、y坐标与宽高
    const $elem = this.$(elem)
    const offset = $elem.offset()!
    const scrollTop =
      document.body.scrollTop || document.documentElement.scrollTop
    const scrollLeft =
      document.body.scrollLeft || document.documentElement.scrollLeft

    return Rectangle.create({
      x:
        offset.left + parseInt($elem.css('border-left-width'), 10) - scrollLeft,
      y: offset.top + parseInt($elem.css('border-top-width'), 10) - scrollTop,
      width: $elem.innerWidth()!,
      height: $elem.innerHeight()!,
    })
  }

在这里插入图片描述
在这里插入图片描述

intersectsWithRect方法: 返回画布区域与滚动区域相交的区域
containersPoint: 判断 鼠标当前 的xy轴是否在区域中

所以我们只需要写个方法判断一下当前鼠标是否还在拖拽区域中,如果在就不生成节点即可。

我们在这个方法里边加一最重要的一句

 // 如果还未拖出当前区域,就不在画布上生成节点
  return !dragRect.containsPoint(p) && super.isInsideValidArea(p);

然后在在线编辑工具里有这个继承方法,我们直接复制粘贴 即可

在这里插入图片描述
试了下果然好用啊!

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关文章:

  • matlab怎么训练神经网络,matlab神经网络训练方法
  • 「面经分享」小米java岗二面面经,已拿offer
  • 手把手教你给女朋友编写一个公众号定时推送(java版本)
  • 数据结构与算法--动态规划
  • 标准IO移动光标
  • 咕咕驴2022新版AI短视频一键换脸小程序源码/带流量主
  • 检查异常处理方式:1,抛出;2,捕获
  • 数组清空(bzero与memset)
  • LocalDateTime获取时间类(当前时间)
  • java计算机毕业设计校园二手交易网站源码+系统+数据库+lw文档+mybatis+运行部署
  • 第1章Linux基础篇-Linux入门
  • java计算机毕业设计校园共享单车管理系统源码+系统+数据库+lw文档+mybatis+运行部署
  • 网课答案API 题库搜题查题系统
  • 手写Promise
  • Automatic differentiation package - torch.autograd
  • angular组件开发
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • C++入门教程(10):for 语句
  • Docker 笔记(2):Dockerfile
  • ES6系统学习----从Apollo Client看解构赋值
  • gf框架之分页模块(五) - 自定义分页
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Laravel核心解读--Facades
  • Linux CTF 逆向入门
  • ng6--错误信息小结(持续更新)
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Shadow DOM 内部构造及如何构建独立组件
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 大整数乘法-表格法
  • 聊聊hikari连接池的leakDetectionThreshold
  • 前端存储 - localStorage
  • 数据结构java版之冒泡排序及优化
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 进程与线程(三)——进程/线程间通信
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (二开)Flink 修改源码拓展 SQL 语法
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (一)Dubbo快速入门、介绍、使用
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转)c++ std::pair 与 std::make
  • (转)JAVA中的堆栈
  • .NET Core中Emit的使用
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • @RunWith注解作用
  • @test注解_Spring 自定义注解你了解过吗?
  • [ IOS ] iOS-控制器View的创建和生命周期
  • [ Linux ] git工具的基本使用(仓库的构建,提交)
  • [ NOI 2001 ] 食物链
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序...