Fabric JS:鼠标按下时复制/粘贴对象

2023-12-26

我正在尝试创建一个块游戏,您可以从菜单中选择形状并将它们放置在画布上。有一个形状菜单,您可以将形状拖到画布上。我希望它在将克隆拖到画布上时将主要形状保留在菜单中。这可能吗?我创建了一个 jsfiddle 来提供帮助。

JSFIDDLE http://jsfiddle.net/ryanverdel/qy5p6a0g/

window.canvas = new fabric.Canvas('fabriccanvas');
var edgedetection = 10; //pixels to snap
canvas.selection = false;

window.addEventListener('resize', resizeCanvas, false);

function resizeCanvas() {
canvas.setHeight(window.innerHeight);
canvas.setWidth(window.innerWidth);
canvas.renderAll();
}

// resize on init
resizeCanvas();

//Initialize Everything
init();

function init(top, left, width, height, fill) {

    var bg = new fabric.Rect({
    left: 0,
    top: 0,
    fill:  "#eee",
    width: window.innerWidth,
    height: 75,    
    lockRotation: true,
    maxHeight: document.getElementById("fabriccanvas").height,
    maxWidth: document.getElementById("fabriccanvas").width,
    selectable: false,
    });

    var squareBtn = new fabric.Rect({
    top: 6,
    left: 18,
    width: 40,
    height: 40,
    fill: '#af3',
    lockRotation: true,
    originX: 'left',
    originY: 'top',
    cornerSize: 15,
    hasRotatingPoint: false,
    perPixelTargetFind: true,
    });

    var circleBtn = new fabric.Circle({
    radius: 20,
    fill: '#f55',
    top: 6,
    left: 105,
    });

    var triangleBtn = new fabric.Triangle({
    width: 40, 
    height: 35, 
    fill: 'blue', 
    top: 10,
    left: 190,
    });

    var sqrText = new fabric.IText("Add Square", {
    fontFamily: 'Indie Flower',
    fontSize: 14,
    fontWeight: 'bold',
    left: 6,
    top: 50,
    selectable: false,
    });

    var cirText = new fabric.IText("Add Circle", {
    fontFamily: 'Indie Flower',
    fontSize: 14,
    fontWeight: 'bold',
    left: 95,
    top: 50,
    selectable: false,
    });

    var triText = new fabric.IText("Add Triangle", {
    fontFamily: 'Indie Flower',
    fontSize: 14,
    fontWeight: 'bold',
    left: 175,
    top: 50,
    selectable: false,
    });

    var shadow = {
    color: 'rgba(0,0,0,0.6)',
    blur: 3,    
    offsetX: 0,
    offsetY: 2,
    opacity: 0.6,
    fillShadow: true, 
    strokeShadow: true 
    }

    window.canvas.add(bg);
    bg.setShadow(shadow);
    window.canvas.add(sqrText);
    window.canvas.add(cirText);
    window.canvas.add(triText);
    window.canvas.add(squareBtn);
    window.canvas.add(circleBtn);
    window.canvas.add(triangleBtn);

    canvas.forEachObject(function (e) {
    e.hasControls = e.hasBorders = false; //remove borders/controls
});

this.canvas.on('object:moving', function (e) {
    var obj = e.target;
    obj.setCoords(); //Sets corner position coordinates based on current angle, width and height
    canvas.forEachObject(function (targ) {
        activeObject = canvas.getActiveObject();


        if (targ === activeObject) return;


        if (Math.abs(activeObject.oCoords.tr.x - targ.oCoords.tl.x) < edgedetection) {
            activeObject.left = targ.left - activeObject.currentWidth;

        }
        if (Math.abs(activeObject.oCoords.tl.x - targ.oCoords.tr.x) < edgedetection) {
            activeObject.left = targ.left + targ.currentWidth;

        }
        if (Math.abs(activeObject.oCoords.br.y - targ.oCoords.tr.y) < edgedetection) {
            activeObject.top = targ.top - activeObject.currentHeight;
        }
        if (Math.abs(targ.oCoords.br.y - activeObject.oCoords.tr.y) < edgedetection) {
            activeObject.top = targ.top + targ.currentHeight;
        }
        if (activeObject.intersectsWithObject(targ) && targ.intersectsWithObject(activeObject)) {

        } else {
            targ.strokeWidth = 0;
            targ.stroke = false;


        }
        if (!activeObject.intersectsWithObject(targ)) {
            activeObject.strokeWidth = 0;
            activeObject.stroke = false;
            activeObject === targ
        }
    });
});
}

See Jsfiddle http://jsfiddle.net/ssk7833/qy5p6a0g/14/在这里,我添加了执行此操作的函数。

function draggable(object) {
    object.on('mousedown', function() {
        var temp = this.clone();
        temp.set({
            hasControls: false,
            hasBorders: false,
        });
        canvas.add(temp);
        draggable(temp);
    });
    object.on('mouseup', function() {
        // Remove an event handler
        this.off('mousedown');

        // Comment this will let the clone object able to be removed by drag it to menu bar
        // this.off('mouseup');

        // Remove the object if its position is in menu bar
        if(this.top<=75) {
            canvas.remove(this);
        }
    });
}

draggable(squareBtn);
draggable(circleBtn);
draggable(triangleBtn);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Fabric JS:鼠标按下时复制/粘贴对象 的相关文章

  • 将 next.js 与纱线工作区结合使用

    今天遇到了这样的项目结构的复杂情况 packages app pages package json ui kit pages package json shared babelrc package json root lvl 包 json
  • 这段代码有什么问题。如果用户选择或不选择复选框,为什么它仍然显示 MsgBox? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 无论我是否选择复选框 它仍然会给出
  • 如何精确缩放已翻译的d3地图

    我有一张已翻译的地图 以使其正确适合画布 我正在尝试实现一种缩放它的方法 它确实有效 但是当您放大时它会远离中心 而不是以鼠标甚至画布为中心 这是我的代码 function map data total views var xy d3 ge
  • 如何在单页应用程序中使用 #-URL?

    本文 http danwebb net 2011 5 28 it is about the hashbangs提出了一个非常令人信服的论点 因为 URL 是长期存在的 它们被添加书签并传递 所以它们应该是有意义的 并且使用哈希进行真正的路由
  • mocha.opts 已弃用,如何迁移到 package.json?

    我正在开发一个大型项目 自从上周我更新了摩卡以来 现在我们收到警告 DeprecationWarning 通过 mocha opts 进行的配置已被弃用并且 将从 Mocha 的未来版本中删除 使用 RC 文件或 改为 package js
  • ES6 类文字中的 IIFE

    在 ES5 中我们都可以这样做 myClass prototype myMethod function return function 我可以对 ES6 类文字执行同样的操作吗 不 至少现在还没有 ES6 类仅支持声明方法 因此任何不直接为
  • 有没有办法将 Google 文档分割成多个 PDF?

    我想在 Google Scripts VBA 代码中复制我为 Word 文档编写的代码 基本上 它通过搜索我插入文档中的标签 将文档 切片 为多个 PDF 文件 目的是允许合唱团使用 forScore 管理乐谱的应用程序 在切片点插入先前注
  • 如何针对 IE 进行优化?

    我有一个 JS 密集型应用程序 它在 IE 中运行缓慢 我将花费大约一周的时间来优化 IE 并且我想要一些关于尝试的方向 我发现这个线程引用Drip https ieleak svn sourceforge net svnroot iele
  • 使用淘汰赛动态显示/隐藏元素

    我有一个表 有四列 即代码 名称 数量和价格 其中 我想动态更改数量列的内容 元素 通常 它应该显示其中显示数量的元素 当用户单击元素时 我想显示该元素 以便用户可以编辑数量 我正在尝试按照 示例2 来实现淘汰赛文档链接 http knoc
  • Google 地图 Javascript v3 折线点击事件

    我正在尝试显示一张地图 其中有多条路线布置为折线 单击多段线时 我想显示特定于该线的数据 将数据与线关联不是问题 但无论单击哪条线 显示的数据都会与最近绘制的线关联 就好像每条新折线都会覆盖最后一条线一样 我有一个数据库 其中包含 gpx
  • 带有桌子的嵌套表

    我在应用了表排序器的表中嵌套了表 它在嵌套表中添加了排序标题 但是它们没有对行进行排序 并且抛出了JavaScript错误 我想拥有 嵌套表不可排序 巢表上的排序实际上可以工作 但不是现状 您的第一个选择要容易得多 使嵌套表不可排序 像这样
  • 如何使用 Node.js 解析 JSON? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我应该如何使用 Node js 解析 JSON 是否有一些模块可以安全地验证和解析 JSON 你可以简单地使用JSON parse h
  • 如何获取从 Express (Node.js) 中的表单传递的数据

    我想获取使用表单从页面传递的数据 并在重定向的页面中使用该数据 我的客户端有这个表格
  • 为什么我从 c# 到 js 得到不同的 MD5 哈希值?

    我有一个用于加密密码的 C 函数 System Security Cryptography MD5CryptoServiceProvider md5Provider new System Security Cryptography MD5C
  • 如何使 4.X Typescript 项目与旧版本的 Typescript(如 3.X)兼容?

    如何使基于 TS 4 X 构建的软件包与 3 X 兼容 例如 如果我有较新的版本 则使用新功能 否则使用any or unknown或旧版本支持的任何内容 有没有可能使用指令 https www typescriptlang org doc
  • React Router Tabs——保持组件安装

    我使用 React Router 创建了选项卡 每个选项卡都有不同的路线 但是 我想通过保持隐藏选项卡的安装来维护选项卡转换之间的选项卡状态 我该如何实现这一目标 每次路由切换时 React 路由器都会重新安装每个组件 已经有人问过这个问题
  • 如何更改数据表中标题单元格的内容?

    我正在使用数据表 http datatables net plugin 在我的可排序列上 我想用按钮替换列文本 但是这样做 oSettings aoColumns i nTh text 我可以检索相应列的文本 但是 oSettings ao
  • 如何使用 Chart.js 版本 3.2.1 在圆环图中添加文本

    我正在使用 Canvas 在 HTML 中使用 如何使用在圆环图中添加文本 这是我的 javascript 代码和 HTML 代码 我使用了图表js版本3 2 1 所以请给出相同版本 3 的解决方案 var overallStatsCanv
  • 尽管 getBoundingClientRect() 是假的,但如何将事件坐标转换为 SVG 坐标?

    我正在尝试根据鼠标的位置在 SVG 元素上动态绘制内容 不幸的是 我很难将 mousemove 事件中的鼠标坐标转换为 SVG 元素的坐标空间 这是我一直在测试的一个有缺陷的函数 CylinderDemo prototype handleM
  • 加载谷歌地图控件时是否有事件?

    我知道tilesloaded 但控件似乎在该事件之后加载 我基本上希望能够通过 jQuery 获取控件 但甚至找不到正确的监听 我也刚刚处理了 没有类似的事件 在控件可见之前空闲和tilesloaded触发 因此 基本上将 特殊控制 类添加

随机推荐

  • 如何打印带有棋子位置列表的棋盘

    我正忙着做作业 我必须编写一个有 2 个 String 的函数 列表字符串包含 3 个字符 第一个是棋子 例如 K 国王 Q 后 R 车 B 主教 N 马 P 兵 第二个指定列 a h 第三个是行号 1 8 第一个字符串列表用于黑色棋子 第
  • 使用 Applescript/Automator 检查活动的互联网连接

    我有一个 Automator 工作流程来 ping 服务器 并下载我经常使用的时间表的最新副本 然后 该时间表会被复制到我的保管箱中 以便我可以在手机上查看 在工作流下载最新计划之前 它会从 Dropbox 中删除旧计划 这很有效 除非我没
  • 如何为 ui-bootstrap 日期选择器创建 angularJs 包装器指令?

    我正在使用ui bootstrap datepicker https angular ui github io bootstrap 显示某些日期字段的指令 然而 大多数时候我需要相同的设置 我希望它带有一个弹出窗口和一个弹出按钮 而且我还想
  • CLI 与 Node.js

    我正在节点中开发一个 CLI 它将发布到 NPM 由于它是一个 CLI 应用程序 我希望它在安装后包含在路径中 因此不需要键入 node my app js 来运行它 我希望它仅与 my app 一起运行 在 package json 中
  • Outlook 中的 HTML 电子邮件呈现 - VML

    我创建了一封 HTML 电子邮件 在 Outlook 2007 中查看时 我看不到某些图像 因为它们是背景 我已经使用 VML 做了一些修改 但是它不允许我将高度值留空 因为它默认为 100px 或者我无法输入自动或百分比 背景图像需要能够
  • 为什么delete会保留Array元素?

    今天我在 Stack Overflow 上偶然发现了一个问题 如何从 JavaScript 关联数组中删除对象 https stackoverflow com questions 346021 令我震惊的是 所接受的答案既具有误导性 又受到
  • 有人成功使用 Azure AD 对 Node.js Web 应用程序的用户进行身份验证吗?

    我正在尝试使用 Azure Active Directory 对我的 node js Web 应用程序的用户进行身份验证 但到目前为止还没有成功 我想知道是否有人真正实现了它 因为文档很差 通常有示例代码 但实际上没有任何指示所需参数是什么
  • tmux:如何打开光标下的文件

    我是 vim 用户并且习惯了gf命令 打开光标下的文件 现在我想问一下 tmux 是否有类似的东西 我可以在 tmux 窗格中导航 并且经常会出现光标下有一个文件路径的情况 现在我希望能够使用 vim 打开光标下的该文件 A 在当前窗口中
  • 堆栈跟踪或有关 Xcode/iPhone 中未处理异常的更多信息

    请原谅我的无知 但在 iPhone 模拟器中运行 iPhone 应用程序时 关于 Xcode 调试器的一些问题一直困扰着我 有时 当我在 Interface Builder 中搞砸一些东西时 我会在运行时遇到未处理的异常 然后被扔回 Xco
  • 无法使用react js将文件上传到djangorest框架

    我正在使用 React Js 将图像上传到 django Restframework 在这里我使用 fetch API 发送 post 请求 Eapp jsx import React Component from react class
  • 过滤至少有两个模式匹配的地方

    我的 data table 中有很多文本数据 我有几个我感兴趣的文本模式 我想对表格进行子集化 以便它显示匹配的文本至少两个的模式 由于某些模式已经是非此即彼的事实 这使得情况变得更加复杂 例如 paul john 我想我要么想要一个表示在
  • 如何将当前行的值除以下一行的值?

    在 Spark Sql 1 6 版本中 使用DataFrames 有没有一种方法可以计算特定列的每一行当前行与下一行相除的分数 例如 如果我有一个只有一列的表 如下所示 Age 100 50 20 4 我想要以下输出 Franction 2
  • 如何显示下一张/上一张卡片的RecyclerView的一部分

    实现此功能的最佳策略是什么 我有一个带有卡片的水平 RecyclerView 每张卡片都会填满整个屏幕 但我希望它显示下一张卡片和上一张卡片 如果它有多个项目 的一部分 我知道我可以通过设置我的卡来实现这一点android layout w
  • 从java中的String中删除除少数特定标签之外的Html标签

    我的输入是纯文本字符串 要求是删除除少数特定标签之外的所有 html 标签 例如 p li u u li li 如果这些特定标签具有类似属性class or id 我想删除这些属性 几个例子 a href Link a gt Link li
  • Hadoop 2.2.0 与 Mahout 0.8 兼容吗?

    我的 hadoop 集群版本 2 2 0 与 mahout 0 8 一起运行 它兼容吗 因为每当我运行这个命令时 bin mahout recommenditembased input mydata dat usersFile user d
  • Google 云端硬盘帮助需要访问自己的云端硬盘帐户

    我想在网页上访问我自己的谷歌驱动器 但允许任何人上传文件并限制下载访问或仅向用户显示有限的文件以供下载 Drive API 假设我将访问其他用户的凭据 但我想要的恰恰相反 任何人都可以查看我的文件 限制查看内容 但可以自由上传 我googl
  • 为什么不能修改 Mongoose 查询返回的数据(例如:findById)

    当我尝试更改 Mongoose 查询返回的数据的任何部分时 它没有任何效果 昨天我花了大约两个小时试图解决这个问题 有各种各样的问题 clone s 使用临时存储变量等等 最后 就在我以为自己要疯了的时候 我找到了解决办法 所以我想将来有人
  • GWT:如何从 RootPanel 获取对按钮的引用?

    我正在使用 GWT 2 4 在我的 onModuleLoad 方法中 给定一个字符串 id 如何从 RootPanel 对象获取对页面上现有按钮的引用 我正在尝试这个 public void onModuleLoad final Butto
  • 存储一个正整数需要多少位?

    存储一个正整数 例如数十亿 需要多少位 您是否必须使用 log2 N 才能找到答案 由于我多次看到错误报告的答案 我想我会发布正确的答案 表示正整数 n 所需的位数为 bits floor log2 n 1 其中 log2 表示以 2 为底
  • Fabric JS:鼠标按下时复制/粘贴对象

    我正在尝试创建一个块游戏 您可以从菜单中选择形状并将它们放置在画布上 有一个形状菜单 您可以将形状拖到画布上 我希望它在将克隆拖到画布上时将主要形状保留在菜单中 这可能吗 我创建了一个 jsfiddle 来提供帮助 JSFIDDLE htt