在 Fabric.js 中使用 setAngle() 后,旋转和缩放控件关闭

2023-12-13

我想让用户旋转对象Fabric.js动力画布,但将其旋转限制为 90 度增量。想法是,当它们旋转然后停止时,物体会以最接近的角度“卡入”到位。

通过监听“object:rotating”,设置最近的角度,然后调用 object.setAngle(angleClosestTo90) 就可以了。然而,一旦对象被“捕捉”,缩放/旋转图像的控件就会关闭。您仍然可以选择它们,但它很挑剔 - 我猜该对象应该位于它的最后一个位置,而不是通过 setAngle() 重新计算的位置。

这个JSFiddle演示了这个问题:

var canvas = new fabric.Canvas("c");

var rect = new fabric.Rect({
  left: 100,
  top: 100,
  fill: 'red',
  width: 90,
  height: 90
});

canvas.add(rect);
canvas.renderAll();

var lastClosestAngle = 0,
    snapAfterRotate = false;

function calculateClosestAngle(targetObj) {
  // if angle > 360 then mod 360
  var currentAngle = targetObj.angle;
  var normalizedAngle = Math.abs(Math.round(Math.asin(Math.sin(currentAngle * Math.PI/360.0)) * 360.0/Math.PI));
  console.log("normalized: ", normalizedAngle);
  snapAfterRotate = true;
  if (normalizedAngle >= 45 && normalizedAngle < 135) {
    return 90;
  } else if (normalizedAngle >= 135 && normalizedAngle < 225) {
    return 180;
  } else if (normalizedAngle >= 225 && normalizedAngle < 315) {
    return 270;
  } else if ((normalizedAngle >= 315 && normalizedAngle <= 360) || (normalizedAngle >= 0 && normalizedAngle < 45)) {
    return 0;
  }
  return currentAngle;
}

canvas.on("object:rotating", function(rotEvtData) {
  var targetObj = rotEvtData.target;
  lastClosestAngle = calculateClosestAngle(targetObj);
});

canvas.on("object:modified", function(modEvtData) {
  // modified fires after object has been rotated 
  var modifiedObj = modEvtData.target;
  if (modifiedObj.angle && snapAfterRotate) {
      modifiedObj.setAngle(lastClosestAngle);
      snapAfterRotate = false;
      canvas.renderAll();
  }
})

旋转盒子,然后松开鼠标。该对象将被选择,但尝试再次旋转它。指针很难找到/不可用。

如果您单击远离对象,然后重新选择(或旋转后仅移动对象),则可以。


在 setAngle() 之后运行 setCoords()。这将更新控件的位置。在你的小提琴中尝试过。工作正常。

   canvas.on("object:modified", function(modEvtData) {
     // modified fires after object has been rotated 
     var modifiedObj = modEvtData.target;
     if (modifiedObj.angle && snapAfterRotate) {
         modifiedObj.setAngle(lastClosestAngle).setCoords();
         snapAfterRotate = false;
         canvas.renderAll();
     }
   })

问候, 贝尼克

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

在 Fabric.js 中使用 setAngle() 后,旋转和缩放控件关闭 的相关文章

随机推荐

  • 使用 oMath.BuildUp 方法的 Excel/Word 方程?

    我正在尝试使用 VBA 在 Microsoft Word 2010 中自动生成方程式并将其插入 Excel 中 因为它不支持 oMath 对象 问题出在 oMath BuildUp 方法中 它不会像手动输入时那样解释 sqrt times
  • 在 C++ 中从字符串中删除非整数

    我的一本书中有一条评论说人们将逗号输入整数并弄乱了你的程序 但它没有详细说明 这让我开始思考 所以我尝试编写一个小算法来获取 std string 并删除所有非整数字符 该代码可以编译 但会跳过输出 为什么没有任何东西被分配给 newstr
  • 将共享指针作为参数传递

    如果我声明一个包含在共享指针中的对象 std shared ptr
  • 仅在 WooCommerce 单一产品页面添加价格后缀,无链接产品

    我在 WooCommerce 单一产品页面上添加价格后缀 并且仅在那里 不在循环中 我使用以下内容 add filter woocommerce get price html custom price suffix 100 2 functi
  • 如何从 MetaTrader 终端 5 MQL 5 向在我的 MT5 主机上本地运行的 Nodejs 服务器发送请求?

    我正在尝试在我的 Nodejs 服务器中获取外汇汇率 并在运行 MetaTrader 终端 5 或 4 时将它们发送给客户端 所以我想我必须使用 MQL4 5 我知道如何在我的 Nodejs 服务器中处理请求 我不知道在哪里编写 MQL4
  • 在 Visual Studio 中看不到“干净的解决方案”选项

    对于其中一种解决方案 当我右键单击解决方案资源管理器中的解决方案名称时 我在上下文菜单中和 生成 菜单中都看不到 清理解决方案 选项 当我对项目进行任何更改并进行调试时 VS 永远不会命中断点 并且我得到 当前不会命中断点 源代码与原始版本
  • .htaccess 中的 301 重定向和 HSTS

    我已将网站更改为 https 并在 htaccess 中设置了重定向 但我也制定了严格的运输安全措施 两者都有必要或有用吗
  • ODOO:在特定时间运行 cron

    我想添加一个在特定时间运行的 cron 作业 我已经在 xml 中添加了 cron 但它有interval number and interval type 如何让它在一天中的特定时间运行
  • 带渐变层的 iOS UISLider

    我正在构建一个 iOS 应用程序 我必须在其中实现自定义 UISlider 问题是内置的UISlider不支持渐变轨迹 另一个问题是我的 UI 风格指南显示当前跟踪值矩形应该是两种颜色的渐变 如图所示 如何构建 UISlider 的自定义版
  • Git:如何将 rebase 与他们的策略结合使用

    基本上 我只想 重新 设置父级 假设提交A 特定提交 commitB 这是某个分支的根提交x 建议here在其中一个答案中 我可以通过移植来做到这一点 稍后我会尝试一下 也许这是更好的方法 然而 在阅读本文之前 我认为这应该可以通过reba
  • C# 中的日期格式

    我有一个用于显示日期时间的字符串 例如 Mon dd Dec YYYY hh mm ss 我想这样显示它 dd Dec YYYY 有什么简单的方法可以做到吗 您可以调用 DateTime 类上的格式化方法 DateTime time Dat
  • 在 C# 中隐藏/显示 Windows 窗体面板 [关闭]

    Closed 这个问题需要调试细节 目前不接受答案 我尝试在 C 中显示 隐藏面板 但是当我单击 button1 时 我想看到 panel1 但出现了 panel2 当我点击按钮 2 时 面板 2 就消失了 但是当我第一次点击按钮2时 面板
  • M 以下 Android 版本的 Android 运行时权限?

    最近我的ola 出租车应用程序 最新更新后 运行时请求位置权限 它没有打开位置设置屏幕 但只需单击 是 设备的我的位置 GPS 就会打开 并且应用程序会继续进行 而无需进入位置设置或任何设置屏幕 此功能即将在 Android M 中推出 并
  • 将数据帧列表中的变量聚合到单个数据帧中

    我正在 R 中执行每个保单的人寿保险估值 每月现金流量预测是按每个保单执行的 并返回以下格式的数据框 例如 Policy1 data frame ProjM 1 200 Cashflow1 rep 5 200 Cashflow2 rep 1
  • 如何在 Selenium 中测试“记住我”复选框功能

    我正在尝试测试登录表单的 记住我 功能 我可以输入用户名和密码 单击复选框 单击提交 然后quit or close 浏览器 但是当我重新打开浏览器时new ChromeDriver 或任何其他WebDriver实现 测试站点不记得任何东西
  • 是否可以强制存在量化类型变量仅具有单一类型?

    考虑下面的代码 trait Foo T def one Foo gt T def two T def three x T def test T f Foo T val b f one b three b two 方法测试无法进行类型检查 它
  • Excel:从工作表调用 vba 函数时将当前单元格作为参数传递

    我正在尝试创建一个 VBA 函数 该函数接受一个单元格作为参数 并使用各种 Range Offset 从那里开始工作 该函数将在工作表单元格中调用 为了进行测试 我使用这个简单的脚本 Public Function testPublic t
  • 使用 chrome 和 safari 查看时,html 页面中的“tt”、“ti”、“ff”等字符消失

    在特定的 html 文件中 查看时所有 ti fi tt 字符都丢失 当我们在inspect element 例如 解决方案 拼写错误为 解决方案 示例截图 相同的 html 在 FireFox 上运行良好 上述问题在 Chrome 和 S
  • Ajax.BeginForm 不调用 onSuccess

    在 ASP NET MVC 3 应用程序中 我使用 Ajax BeginForm 将书面文本发布到控制器 using Ajax BeginForm Post Forum new threadId Model Thread Id new Aj
  • 在 Fabric.js 中使用 setAngle() 后,旋转和缩放控件关闭

    我想让用户旋转对象Fabric js动力画布 但将其旋转限制为 90 度增量 想法是 当它们旋转然后停止时 物体会以最接近的角度 卡入 到位 通过监听 object rotating 设置最近的角度 然后调用 object setAngle