Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在fabric.js中无默认选择地画线

在fabric.js中无默认选择地画线
EN

Stack Overflow用户
提问于 2021-12-22 13:14:17
回答 1查看 183关注 0票数 0

晚安,亲爱的同学们!我需要两个绘图应用程序与两个按钮:选择和绘制线。按钮“选择”应该选择形状来转换它们。THe按钮画线应该画线。

现在,我的代码画了一行,并选择了它。我想分道扬镳。我该如何解决我的问题?

代码语言:javascript
运行
AI代码解释
复制
var Line = (function() {
  function Line(canvas) {
    this.canvas = canvas;
    this.isDrawing = false;
    this.bindEvents();
  }

  Line.prototype.bindEvents = function() {
    var inst = this;
    inst.canvas.on('mouse:down', function(o) {
      inst.onMouseDown(o);
    });
    inst.canvas.on('mouse:move', function(o) {
      inst.onMouseMove(o);
    });
    inst.canvas.on('mouse:up', function(o) {
      inst.onMouseUp(o);
    });
    inst.canvas.on('object:moving', function(o) {
      inst.disable();
    })
  }

  Line.prototype.onMouseUp = function(o) {
    var inst = this;
    if (inst.isEnable()) {
      inst.disable();
    }
  };

  Line.prototype.onMouseMove = function(o) {
    var inst = this;
    if (!inst.isEnable()) {
      return;
    }

    var pointer = inst.canvas.getPointer(o.e);
    var activeObj = inst.canvas.getActiveObject();

    activeObj.set({
      x2: pointer.x,
      y2: pointer.y
    });
    activeObj.setCoords();
    inst.canvas.renderAll();
  };

  Line.prototype.onMouseDown = function(o) {
    var inst = this;
    inst.enable();

    var pointer = inst.canvas.getPointer(o.e);
    origX = pointer.x;
    origY = pointer.y;

    var points = [pointer.x, pointer.y, pointer.x, pointer.y];
    var line = new fabric.Line(points, {
      strokeWidth: 5,
      stroke: 'red',
      fill: 'red',
      originX: 'center',
      originY: 'center',
      hasBorders: false,
      hasControls: false
    });
    inst.canvas.add(line).setActiveObject(line);
  };

  Line.prototype.isEnable = function() {
    return this.isDrawing;
  }

  Line.prototype.enable = function() {
    this.isDrawing = true;
  }

  Line.prototype.disable = function() {
    this.isDrawing = false;
  }

  return Line;
}());
console.log(fabric);
var canvas = new fabric.Canvas('canvas');
var line = new Line(canvas);
代码语言:javascript
运行
AI代码解释
复制
<div id="canvasContainer">
  <canvas id="canvas" width="400" height="400" style="border: solid 1px"></canvas>
</div>
  <script
    type="text/javascript"
    src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.4.0/fabric.min.js"
  ></script>

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-23 04:42:57

目前您有绘图和选择,因为Fabric使它的关联画布在默认情况下是可选择的。

此行为通过更改调用.selection返回的对象上的布尔值new fabric.Canvas() 属性来控制。

因此,您所要做的就是设置两个按钮(选择/绘制),将canvas.selection设置为所需的状态,并在进行任何selection==true绘图之前从mouseMove处理程序返回。

下面是一个例子:

代码语言:javascript
运行
AI代码解释
复制
function select(state) {
  canvas.selection = state;
}

var Line = (function() {
  function Line(canvas) {
    this.canvas = canvas;
    this.isDrawing = false;
    this.bindEvents();
  }

  Line.prototype.bindEvents = function() {
    var inst = this;
    inst.canvas.on('mouse:down', function(o) {
      inst.onMouseDown(o);
    });
    inst.canvas.on('mouse:move', function(o) {
      inst.onMouseMove(o);
    });
    inst.canvas.on('mouse:up', function(o) {
      inst.onMouseUp(o);
    });
    inst.canvas.on('object:moving', function(o) {
      inst.disable();
    })
  }

  Line.prototype.onMouseUp = function(o) {
    var inst = this;
    if (inst.isEnable()) {
      inst.disable();
    }
  };

  Line.prototype.onMouseMove = function(o) {
    var inst = this;
    if (!inst.isEnable() || canvas.selection) {
      return;
    }

    var pointer = inst.canvas.getPointer(o.e);
    var activeObj = inst.canvas.getActiveObject();

    activeObj.set({
      x2: pointer.x,
      y2: pointer.y
    });
    activeObj.setCoords();
    inst.canvas.renderAll();
  };

  Line.prototype.onMouseDown = function(o) {
    var inst = this;
    inst.enable();

    var pointer = inst.canvas.getPointer(o.e);
    origX = pointer.x;
    origY = pointer.y;

    var points = [pointer.x, pointer.y, pointer.x, pointer.y];
    var line = new fabric.Line(points, {
      strokeWidth: 5,
      stroke: 'red',
      fill: 'red',
      originX: 'center',
      originY: 'center',
      hasBorders: false,
      hasControls: false
    });
    inst.canvas.add(line).setActiveObject(line);
  };

  Line.prototype.isEnable = function() {
    return this.isDrawing;
  }

  Line.prototype.enable = function() {
    this.isDrawing = true;
  }

  Line.prototype.disable = function() {
    this.isDrawing = false;
  }

  return Line;
}());
var canvas = new fabric.Canvas('canvas');
canvas.selection = false;
var line = new Line(canvas);
代码语言:javascript
运行
AI代码解释
复制
<div id="canvasContainer">
  <canvas id="canvas" width="400" height="400" style="border: solid 1px"></canvas>
</div>
<button onclick='select(true);'>Select</button>
<button onclick='select(false);'>Draw</button>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.4.0/fabric.min.js"></script>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70455180

复制
相关文章
Openlayer画线
可以把图层保存在数组中,移除时采用removeLayer,只能单个移除图层,暂时没看到移除多个图层的方法
tianyawhl
2021/03/02
9170
Chrome 默认无痕模式
首先无痕模式并不是真的隐藏你在互联网上的身份了,只是本地电脑不保存记录而已,也不能阻止广告商根据你的浏览偏好来投放广告。如果你在淘宝浏览了不该看的内容,下次进去系统还是会推送相关的商品。
上山打老虎了
2022/06/14
9400
Chrome 默认无痕模式
在 Java 中如何优雅地判空
  作为搬砖党的一族们,我们对判空一定再熟悉不过了,不要跟我说你很少进行判空,除非你喜欢NullPointerException。
芋道源码
2019/11/21
2.4K0
Python 在 Wiki 标记中添加无
Python编程快速上手实践项目题目,欢迎指证与优化! 代码: #! python3 # bulletPointAdder.py - Adds Wikipedia bullet points to the start # of each line of text on the clipboard. import pyperclip text = pyperclip.paste() # 从剪贴板粘贴文本 lines = text.split('\n') # 使用 split()方法得到一个字符串的列表,以回
py3study
2020/01/09
3.1K0
在Java中如何优雅地判空
作为搬砖党的一族们,我们对判空一定再熟悉不过了,不要跟我说你很少进行判空,除非你喜欢 NullPointerException。
JAVA葵花宝典
2019/11/15
1.5K0
canvas-画线
坐标系统简析 左边是笛卡尔坐标系,右边是canvas坐标系。 笛卡尔坐标系(Cartesian coordinate system): 也称直角坐标系,是一种正交坐标系。二维的直角坐标系是由两条相互垂
前端黑板报
2018/01/29
1.7K0
canvas-画线
使用 singledispatch 在 Python 中追溯地添加方法
Python 是当今使用最多流行的编程语言之一,因为:它是开源的,它具有广泛的用途(例如 Web 编程、业务应用、游戏、科学编程等等),它有一个充满活力和专注的社区支持它。这个社区是我们在 Python Package Index(PyPI)中提供如此庞大、多样化的软件包的原因,用以扩展和改进 Python。并解决不可避免的问题。
用户8639654
2021/09/23
2.7K0
在 Dart 中更好地使用类和 mixin
Dart 是一门“纯”面向对象的编程语言,其中所有的对象都是类的实例。但是 Dart 并不要求所有代码都定义在一个类中。我们可以在一个类的外面定义顶级变量、常量、函数 —— 就像面向过程语言那样。正式因为这样,Dart 的编码会有些特殊的建议。
玖柒的小窝
2021/11/28
2.5K0
在 Cocos Creator 中优雅且高效地管理弹窗
弹窗对于我们来说应该一点都不陌生,无论是在网页上,APP 上还是在游戏中都非常的常见。
陈皮皮
2020/11/05
2.1K0
在 Android 中如何优雅地配置私密信息
在实际的项目开发中,经常会用到一些第三方的 SDK ,而使用这些 SDK 基本上都是需要配置 APPKEY 或 APPSECRET 等信息。此外 APP 打包时需要 KEYSTORE , STOREPASSWORD 的信息。这些都是私密配置信息,不应该发布到 Github 或其它公共空间。
阳仔
2019/07/31
1.7K0
logstash在Elasticsearch中创建的默认索引模板问题
在ELK架构中,使用logstash收集服务器中的日志并写入到Elasticsearch中,有时候需要对日志中的字段mapping进行特殊的设置,此时可以通过自定义模板template解决,但是因为logstash默认会向Elasticsearch提交一个名为logstash的模板,所以在定义logstash配置文件时有一些关键点需要注意。本文基于logstash-5.6.4和elastcisearch-5.6.4对需要注意的关键点进行列举。
bellen
2018/10/30
7.5K0
logstash在Elasticsearch中创建的默认索引模板问题
在seaborn中设置和选择颜色梯度
seaborn在matplotlib的基础上进行开发,当然也继承了matplotlib的颜色梯度设置, 同时也自定义了一系列独特的颜色梯度。在seaborn中,通过color_palette函数来设置颜色, 用法如下
生信修炼手册
2020/11/02
3.9K0
在seaborn中设置和选择颜色梯度
[Java] 在Java中优雅地进行文件IO操作
我们知道C语言中用fopen函数打开一个文件流进行读写操作,C++的fstream提供了ofstream, ifstream, fstream来处理面向流的输入和输出,Python中则更为简单,你可以用with上下文配合open打开一个File对象来进行文件的读写。
泰坦HW
2020/07/22
1.4K0
[Java] 在Java中优雅地进行文件IO操作
Groovy参数默认值在接口测试中应用
近在工作中频繁的使用到Groovy编程语言的一个特性:就是可以设置参数默认值。在编写方法或者函数的代码的时候,可以选择对参数进行一个默认值的设定。这样做就相当于对方法进行了重载。我们没写一个方法,其实就是有很多个方法重载,对于已经设置过默认值的参数。会多一个重载方法是忽略这个参数的(使用默认值)。
FunTester
2021/10/08
1.5K0
古典:ETA——教你如何无压高效地前进!
昨天的思想夜宴上,有人提出这样的困惑: “我给自己计划了一件事情,但是干着又心烦,总是做不下去——如何提高自己的执行力?” 估计很多人有这种困惑。 遇到这个问题,首先要问一句——这个是执行力问题吗?比如你做其他事情的时候,是不是也这样?有人的确总是这样,而且非常困扰——比如说我,我总在晚上7点20才交晚上9点钟要发的专栏,我不太困扰,但是小编表示很恼火——这种情况生生世世,轮回不已,这就算是一个执行力问题; 但是更多人会告诉你,不是的——我只是在某类、某件事情上会这样,有人是无聊的
用户1756920
2018/06/21
6340
在Spring Security 5中如何使用默认的Password Encoder
在Spring Security 4中,可以使用in-memory认证模式直接将密码以纯文本的形式存储。
烟雨平生
2023/03/07
1.6K0
在Spring Security 5中如何使用默认的Password Encoder
android在代码中怎么设置 RadioGroup的默认值
这种需求一般是   个人中心 需要的   当用户修改了个人资料之后,下次在修改的话需要从服务器中拿到数据   
wust小吴
2019/07/08
5.3K0
在Windows10 Bash中默认启动其他shell By HKL,
由于Windows10 Bash是通过在命令行中bash命令直接启动Linux的Bash软件,可通过修改.bashrc文件使得fish等shell默认启动。 通过在用户目录~中编辑.bashrc文件。
hiplon
2020/07/22
1.7K0
在Windows10 Bash中默认启动其他shell
    		    			
                
                By HKL,
点击加载更多

相似问题

如何用fabric.js确定画布上画线的宽度

12

在in图中在选择点之间画线

13

在画布上没有正确地画线。

20

在Fabric.js中禁用组选择

31

如何更改fabric.js上的默认fabric.js?

45
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档