vue项目中,修改fabric默认操作

场景:fabricjs绘制的元素,默认点击鼠标左键即可自由移动元素。需要把操作改为,点击鼠标左键先选中元素,只有选中的元素,按住鼠标左键后才能移动

javascript 复制代码
// 初始化canvas
var canvas = new fabric.Canvas('c');

// 添加一个矩形元素
var rect = new fabric.Rect({
  left: 100,
  top: 100,
  fill: 'red',
  width: 60,
  height: 70,
  selectable: false // 初始时不可选中
});

canvas.add(rect);

// 监听对象的选中事件
canvas.on('mouse:down', function(options) {
  if (options.target) {
    var object = options.target;
    object.set({
      selectable: true, // 设置对象为可选中
      evented: false // 设置对象为不可触发事件,防止直接移动
    });
    canvas.setActiveObject(object); // 手动设置为选中状态
    canvas.renderAll();
  }
});

// 监听鼠标按下事件,用于启用移动
canvas.on('mouse:move', function(options) {
  if (canvas.getActiveObject()) {
    var object = canvas.getActiveObject();
    object.set({
      evented: true // 当对象被选中时,设置为可触发事件,允许移动
    });
  }
});

// 监听鼠标释放事件,用于禁用直接的移动
canvas.on('mouse:up', function(options) {
  if (canvas.getActiveObject()) {
    var object = canvas.getActiveObject();
    object.set({
      selectable: false, // 移动后设置对象为不可选中
      evented: true // 保持对象可触发事件状态
    });
    canvas.discardActiveObject(); // 取消对象的选中状态
    canvas.renderAll();
  }
});

原理,通过修改参数,实现。

selectable: true, // 设置对象为可选中

evented: false // 设置对象为不可触发事件,防止直接移动

相关推荐
Penge66618 小时前
HTML基础:HTML 标签属性
前端
Penge66618 小时前
HTML 基础:块级元素、行内元素与行内块元素详解
前端
Penge66619 小时前
前端基础:html语义化
前端
用户308169987648519 小时前
同一个端口能被两个程序监听吗?TCP 11 组绑定实测
前端
deli00719 小时前
红绿灯配时实测:固定 60 秒 vs 自适应,2400 辆车差多少
前端
去伪存真19 小时前
井道无信号、满手黑机油,我们如何用 DeepSeek V4 打造不“犯浑”的电梯维保 Agent?
前端·agent
deli00719 小时前
60fps 为什么还是一顿一顿?帧时间曲线实测给你看
前端
时间的情敌20 小时前
Cesium 流动管线、管道动画、管线流向仿真,管网、油气、水利孪生高频需求
前端·交互·cesium
yuyuxun120 小时前
协同过滤的校园二手物品智能推荐系统的设计与实现 毕业设计-附源码40082
javascript·vue.js·spring boot·python·数据分析·django·课程设计
wangxiaoxuan2171 天前
SLAM 的基本结构:前端、后端、回环与地图优化
前端·机器人·科沃斯八界