Fabric.js 监听元素相交(重叠)

news2025/7/13 0:22:56

本文简介

点赞 + 关注 + 收藏 = 学会了


fabric.js 提供了一个方法可以检查对象是否与另一个对象相交(也可以叫元素是否重叠)。

这个方法叫 intersectsWithObject()


本文主要想提一下 fabric.js 存在这么一个方便的方法。


检测元素是否相交有什么用呢?

这个功能在日常开发中其实很实用,在它的帮助下我们可以实现“防止对象碰撞”、“对象自动对齐贴合”等功能。



动手试试看

为了演示 intersectsWithObject() ,我打算做如下操作:

  1. 创建画布
  2. 创建矩形、圆形、三角形元素,并将它们添加到画布里
  3. 使用 canvas.on('object:moving') 监听图形元素移动
  4. 元素移动的过程中不断遍历画布当前所有元素,如果正在移动的元素和其他图形相交了,就在控制台输出被相交的元素的类型。

在“第4点”里,使用了 intersectsWithObject() 方法判断元素是否相交,如果相交就会返回 true

详情请看下方代码及注释。


file

<canvas id="c" width="500" height="500" style="border: 1px solid #ccc;"></canvas>

<script src="../js/fabric.js"></script>
<script>
  let canvas = new fabric.Canvas('c')

  // 矩形 - 亮粉色
  let rect = new fabric.Rect({
    left: 260,
    top: 110,
    width: 80,
    height: 60,
    fill: 'hotpink'
  })

  // 圆形 - 黄绿色
  let circle = new fabric.Circle({
    top: 200,
    left: 150,
    radius: 30,
    fill: 'yellowgreen'
  })

  // 三角形 - 天蓝色
  let triangle = new fabric.Triangle({
    width: 100,
    height: 100,
    left: 300,
    top: 200,
    fill: 'skyblue'
  })

  // 将矩形、圆形、三角形添加到画布中
  canvas.add(rect, circle, triangle)

  // 监听对象移动
  canvas.on('object:moving', function(options) {

    // 通过 canvas.forEachObject 遍历画布上所有元素
    canvas.forEachObject(function(obj) {

      // 排除当前正在移动的元素
      if (obj === options.target) return

      // 检查对象是否与另一个对象相交
      if (options.target.intersectsWithObject(obj)) {
        // 输出当前被接触的对象类型
        console.log(obj.type)
      }
    })
  })
</script>

以上就是 intersectsWithObject() 的基本用法。

其实 intersectsWithObject() 可以传入3个参数,用法如下:

intersectsWithObject(other, absoluteopt, calculateopt)
  • other: Object类型,要检测的对象
  • absoluteopt: Boolean类型,使用不带 viewportTransform 的坐标
  • calculateopt: Boolean类型,使用当前位置的坐标代替


代码仓库

⭐ intersectsWithObject检测对象是否相交



推荐阅读

点赞 + 关注 + 收藏 = 学会了


我最近在编写《Fabric.js 中文教程》,希望这份教程能帮到你和你的朋友~


其他推荐:

👍《Fabric.js 喷雾笔刷 从入门到放肆》

👍《Fabric.js 自定义子类,创建属于自己的图形》

👍《Fabric.js 自定义选框样式》

👍《Fabric.js 元素中心缩放》

👍《Fabric.js 动态设置字号大小》

👍《Fabric.js 橡皮擦的用法(包含恢复功能)》


本文参考了 Intersection 实例:http://fabricjs.com/intersection 代码仓库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/109418.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【UE4 第一人称射击游戏】04-血溅效果

素材资料地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1epyD62jpOZg-o4NjWEjiyg 密码&#xff1a;jlhr 效果&#xff1a; 步骤&#xff1a; 1.将图片素材导入UE4 2.创建一个控件蓝图&#xff0c;命名为“Damageeffect” 双击打开“Damageeffect”&#xff0…

【关于时间序列的ML】项目 6 :机器学习中使用 LSTM 的时间序列

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

现在转行学python,前景和优势有哪些?

正所谓“男怕入错行&#xff0c;女怕嫁错郎”&#xff0c;可想而知进入一个正确的行业有多重要。 IT行业的高薪吸引着越来越多转行“入坑”&#xff0c;python作为目前的大势&#xff0c;是很多人转行的首选。 为什么这么多的人都想转行学习python&#xff0c;python有哪些前…

【架构师(第四十九篇)】 服务端开发之认识 Docker-compose

Docker-compose 介绍 通过一个配置文件&#xff0c;可以让系统一键启动所有的运行环境&#xff0c;nodejs&#xff0c;mysql&#xff0c;redis&#xff0c;mongodb 等。 如果开发环境需要多个服务&#xff0c;就需要启动多个 Docker 容器。 要连通多个 Docker 容器&#xf…

转行程序员,如何挑选既高薪又适合的编程语言?

“你为什么要学这个编程语言&#xff1f;” 很多人面对这个问题时&#xff0c;都回答不上来&#xff0c;大部分都只是看到了表象&#xff0c;或是脑子一热&#xff0c;随意给自己选了一个。事实上自己对这个编程语言的特性和市场现状并不了解&#xff0c;甚至都不知道这个语言到…

关于为什么要做量化白皮书这件事

我们一直想着再为行业做点什么 是从什么时候开始 在心里埋下了种子呢 许是从有人说“高频量化不除&#xff0c;市场再无宁日”的时候 是从中国基金报房佩燕老师写“这锅我们不背“的时候 是从部分量化私募主动站出来说话的时候 现今的互联网时代信息太繁杂 有时可以不用太…

ETCD的创建

一&#xff1a; 好原文链接&#xff1a; 搭建高可用Kubernetes集群之etcd v3.4.13集群搭建(一&#xff09; - 人艰不拆_zmc - 博客园1. etcd 简介 coreos 开发的分布式服务系统&#xff0c;内部采用 raft 协议作为一致性算法。作为服务发现系统&#xff0c;有以下的特点&#x…

【Vue】源码—虚拟DOM和diff算法

1.理解虚拟DOM和diff算法 1.1什么是虚拟DOM&#xff1f; 从本质上来说&#xff0c;虚拟DOM是一个JavaScript对象&#xff0c;通过对象的方式来表示DOM结构。将页面状态抽象为JS对象的形式&#xff0c;配合不同的渲染工具&#xff0c;使跨平台渲染成为可能。虚拟DOM是DOM的抽象…

【Python百日进阶-数据分析】Day136 - plotly旭日图:px.sunburst()实例

文章目录四、实例4.1 带有 plotly.express 的旭日图4.1.1 基础旭日图4.1.2 带有 plotly.express 的矩形 DataFrame 的旭日形4.1.3 改变path顺序&#xff0c;从而改变父子关系4.1.4 在 px.sunburst 中具有连续颜色参数的矩形 DataFrame 的 Sunburst4.1.5 在 px.sunburst 中具有离…

20岁电竞选手自学编程转行程序员,轻松拿下大厂offer

话说 人与人之间的差距 貌似挺小的 毕竟 不管是大佬还是我们 都是两只眼睛、一个鼻子、一张嘴 不多不少 醒醒&#xff0c;别睡了 人和人的差距是很大的&#xff01; 同样身为互联网冲浪选手 别人干啥啥都行 你却只会在评论区扣“牛X” #01 在多数人的认知里 电竞选…

校园网上报修系统/宿舍报修系统的设计与实现

摘要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;校园网上报修系统当然也不能排除在外&#xff0c;从报修信息的统计和分析&#xff0c;在过程中会产生大量的、各种各样的数…

Java Number Math 类

一般地&#xff0c;当需要使用数字的时候&#xff0c;我们通常使用内置数据类型&#xff0c;如&#xff1a;byte、int、long、double 等。 实例 int a 5000; float b 13.65f; byte c 0x4a; 然而&#xff0c;在实际开发过程中&#xff0c;我们经常会遇到需要使用对象&…

Java -- OSS对象存储服务(Object Storage Service,简称 OSS)文件服务器

一个成熟的技术架构要有一定的分离性&#xff0c; 平台级的产品一般会这么分&#xff1a;应用服务器、数据库服务器、文件服务器。一般文件、数据库、应用服务器&#xff0c;都应该做逻辑和物理的分离。 以前我们想要做文件上传可能要自己去搭建一个专门的服务器&#xff0c;然…

【Oracle】Oracle学习笔记

【Oracle】Oracle学习笔记 目录【Oracle】Oracle学习笔记P1、Oracle数据库的安装和配置P2、Oracle数据库管理P3-0、初步SQLP3-1、基本SQL SELECT语句课程学习链接&#xff1a; 【尚硅谷】Oracle数据库全套教程&#xff0c;oracle从安装到实战应用 P1、Oracle数据库的安装和配置…

学python以后做什么工作

python是一门很好的编程语言&#xff0c;很多人都在学&#xff0c;那么学完python以后能做什么工作呢&#xff1f;下面小编给大家总结一下。 软件开发&#xff0c;用python做软件是很多人正在从事的工作&#xff0c;不管是B/S软件&#xff0c;还是C/S软件&#xff0c;都能做。…

【自动化测试入门基础知识】离月薪15k的自动化工程师又进了1步

一、首先&#xff0c;什么是自动化测试&#xff1f; 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常&#xff0c;在设计了测试用例并通过评审之后&#xff0c;由测试人员根据测试用例中描述的过程一步步执行测试&#xff0c;得到实际结果与期望结果的比较…

Idea 报Error:java:无效的源发行版13

今天运行远程克隆的项目&#xff0c;发现报错为Idea 报Error:java:无效的源发行版13。 主要的原因就是克隆的项目和自己idea的jdk版本不一致。 java无效的源发行版13一、查看jdk版本1、file--setting2、找到java compiler3、选择file---project structure4、选择1.8jdk和85、这…

day06-表单标签及属性

文章目录一、知识回顾&#xff1a;二、单元内容6.1 表单标签6.1.1 表单标签 生活中的表单&#xff1a;网页中的表单&#xff1a;程序员中的表单&#xff1a;运行结果&#xff1a;6.2 表单标签的输入标记6.2.1 表单的文本框和密码框输入标记及提示信息属性文本框 密码框6.2.2 表…

疫情之下,文科生转行学编程靠不靠谱?

毕业季越来越近了&#xff0c;突发的疫情将可能让2023年成为最难就业年&#xff01;居危思变&#xff0c;在大环境不好的背景下&#xff0c;很多毕业生都准备暂时先不考虑就业&#xff0c;而是继续加强技能学习&#xff0c;待形势好转再继续找工作&#xff01;而说起当前各行业…

【蓝桥杯】第10届Scratch国赛第6题程序1 -- 捉迷藏

[导读]:蓝桥杯大赛是工业和信息化部人才交流中心举办的全国性专业信息技术赛事。蓝桥杯大赛首席专家倪光南院士说:“蓝桥杯以考促学,塑造了领跑全国的人才培养选拨模式,并获得了行业的深度认可。” 春雷课堂计划推出Scratch蓝桥杯真题解析100讲,这是春雷老师解读Scratch蓝…