Fabric.js在vue2中使用

Fabric.js安装


这里我是基于vue来使用的,先安装上Fabric.js

 npm install fabric 

在main.js中

import fabric from 'fabric'
Vue.use(fabric);

Fabric 提供了 7 种基础形状:

  • fabric.Circle (圆)
  • fabric.Ellipse (椭圆)
  • fabric.Line (线)
  • fabric.Polyline (多条线绘制成图形)
  • fabric.triangle (三角形)
  • fabric.Rect (矩形)
  • fabric.Polygon (多边形)

绘制图形

声明画布

var canvas = new fabric.Canvas('main');

参数介绍

Fabric.js canvas提供的画布对象的实例
canvas.selection:true // 指定是否应该在画布上可对象选择。默认true(显示)
canvas.perPixelTargetFind: true // 这一句说明选中的时候以图形的实际大小来选择而不是以边框来选择
canvas.skipTargetFind: false, //当为真时,跳过目标检测。目标检测将返回始终未定义。点击选择将无效
canvas.selectable: false,  //为false时,不能选择对象进行修改

事件绑定

使用Fabric.js,需要将事件绑定到canvas对象上时,需要使用Fabric.js提供的api
mouse(鼠标事件)

  • move:按下且移动

  • down:按下时

  • up:按下抬起时

  • dblclick:双击时

  • mouseout:离开元素时

  • mousewheel:滚轮事件

selection

  • created 初次选中图层

  • updated 图层选择变化

  • cleared 清空图层选中

after- render画布重绘后

object(对象)

  • selected:被选中

  • deselected:取消选中

  • moving:移动

  • rotating:旋转

  • added:添加

  • removed:移除

  • modified:调整

set与get

obj.set()通常设置属性的方式有两种,第一种是在绘制的时候添加进去。

另一种是通过set方法设置

例:obj.set({color:‘’})

注意:需canvas.add(obj)刷新页面

obj.get()

有set方法自然就有get方法

例:obj.getXXX 获取相应属性的属性值

注意事项 obj.renderAll()所有图层的操作之后,都需要调用这个方法刷新

  • obj.bringForward(); // 上移图层

  • obj.sendBackwards();// 下移图层

  • card.moveTo(obj, index); // 使用canvas对象的moveTo方法,移至图层到指定位置

  • obj.rotate(angle) // 旋转图层

  • obj.set({ scaleX/Y: -this.selectedObj.scaleX/Y,}) // 翻转图层,沿着X轴或者Y轴翻转

  • obj.remove() // 删除图层
    在进行相应操作后都需要canvas.renderAll()重新刷新画布,否则操作不生效

部分示例

  this.canvas.on("mouse:down", this.mousedown);
  this.canvas.on("mouse:move", this.mousemove);
  this.canvas.on("mouse:up", this.mouseup);
Fabric.js 提供的绘制图像属性

fabric.Rect (矩形)

fabric.Rect({
  selectable:true, // 可被选中,默认true(显示)
  hasBorders: true, // 选中时,是否显示边框线,默认true(显示)
  hasControls: true, // 它指定是否启用控制(缩放),默认true
  left:0, // 距离画布左侧的距离
  top:0, // 距离画布上边的距离
  fill:'oink', // 背景颜色
})

实现

Fabric.js提供了很详细的canvas操作api,这个画面也全部基于Fabric.js来实现,这里我稍微说一下遇到的坑

箭头

箭头的话,是通过绘制路径Path来实现,Fabric.js中的Path包括一系列的命令,这基本上模仿一个笔从一个点到另一个。在“移动”,“线”,“曲线”,或“弧”等命令的帮助下,路径可以形成令人难以置信的复杂形状。同组的路径(路径组的帮助),开放更多的可能性,基本的为:
“M” 代表 “move” 命令, 告诉笔到 0, 0 点
“L” 代表 “line” 画一条0, 0 到 200, 100 的线
‘Z’ 代表闭合路径
这里的箭头就是通过一些简单的计算来描绘路径,实现箭头,mouseFrom表示鼠标起始点,mouseTo表示鼠标终点

let x1 = mouseFrom.x,x2= mouseTo.x,y1 = mouseFrom.y,y2= mouseTo.y;
let w = (x2-x1),h = (y2-y1),sh = Math.cos(Math.PI/4)*16
let sin = h/Math.sqrt(Math.pow(w,2)+Math.pow(h,2))   
let cos = w/Math.sqrt(Math.pow(w,2)+Math.pow(h,2)) 
let w1 =((16*sin)/4),h1 = ((16*cos)/4),centerx=sh*cos,centery=sh*sin
/**
 * centerx,centery 表示起始点,终点连线与箭头尖端等边三角形交点相对x,y
 * w1 ,h1用于确定四个点
*/ 
let path = " M " + x1 + " " + (y1);
  path += " L " + (x2-centerx+w1) + " " + (y2-centery-h1);
  path += " L " + (x2-centerx+w1*2) + " " + (y2-centery-h1*2);
  path += " L " + (x2) + " " + y2;
  path += " L " + (x2-centerx-w1*2) + " " + (y2-centery+h1*2);
  path += " L " + (x2-centerx-w1) + " " + (y2-centery+h1);
  path += " Z";
canvasObject = new fabric.Path(
  path,
  {
    stroke: this.color,
    fill: this.color,
    strokeWidth: this.drawWidth
  }
);
this.canvas.add(canvasObject);
手动绘制多边形

这个在Fabric.js官网上本来是有一个demo的,但是不知为何单单这个demo页面404,其余demo都在,没办法,只能自己写一个,代码太多我就补贴上来了,我说一下实现思路(伪代码)

  • 点击第一个点时,在canvas上绘制一个小圆点,作为初始点
  • 点击第二下的时候,使用new fabric.Line方法绘制一条线
  • 点击第三下时,根据这三个点使用new fabric.Polygon方法绘制多边形
  • 当点击最开始那个小圆点的时候,重新绘制最终的多边形,否处重复第三步
事件绑定

使用Fabric.js,需要将事件绑定到canvas对象上时,需要使用Fabric.js提供的api

  this.canvas.on("mouse:down", this.mousedown);
  this.canvas.on("mouse:move", this.mousemove);
  this.canvas.on("mouse:up", this.mouseup);

而不能直接在canvas上监听事件,因为可以看到canvas上还有一层canvas
Snipaste_2020-04-01_11-01-12.png

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GIS学习

匹配查询,先连接两个表,然后在一个表里面查询 合并两个形状 比较好的colormap http://soliton.vm.bytemark.co.uk/pub/cpt-city/views/totp-cpt.html https://docs.gmt-china.org/latest/cpt/builtin-cpt/ 计算坡度时就要捕捉栅格 重分类时也要捕捉栅…

protobuf原理解析-基于protobuf-c实现序列化,反向序列化

1.一个实例 前面介绍了使用protobuf的流程. (1). 定义proto文件来描述需要序列化和反向序列化传输的消息. (2). 借助proto-c,为proto文件生成对应的代码控制文件. (3). 程序借助生成的代码控制文件和protobuf-c动态库的支持实现类…

HarmonyOS如何创建及调用三方库

介绍 本篇主要向开发者展示了在Stage模型中,如何调用已经上架到三方库中心的社区库和项目内创建的本地库。效果图如下: 相关概念 Navigation:一般作为Page页面的根容器,通过属性设置来展示页面的标题、工具栏、菜单。Tabs&#…

win10 配置 oh-my-posh

win10 配置 oh-my-posh 0. 前置1. 安装1.1. 软件1.2. 字体1.3. 激活1.3.1. Git Bash1.3.2. PowerShell 2. 配置2.1. 效果2.2. 说明2.3. 其他2.3.1. 新版PowerShell2.3.2 conda问题 0. 前置 这个东西毕竟是个,命令行美化工具,所以需要先有一个命令行&…

代码随想录算法训练营第60天 | 84.柱状图中最大的矩形

单调栈章节理论基础: https://leetcode.cn/problems/daily-temperatures/ 84.柱状图中最大的矩形 题目链接:https://leetcode.cn/problems/largest-rectangle-in-histogram/description/ 思路: 本题双指针的写法整体思路和42. 接雨水是一…

ubuntu 20.04 Kimera semantic 运行记录

Ubuntu20.04 Kimera Semantic运行记录 Kimera VIO ROS 配置 MIT Kimera-VIO-ROS 安装 mkdir -p Kimera_ws/src cd Kimera_ws catkin init catkin config --cmake-args -DCMAKE_BUILD_TYPERelease -DGTSAM_TANGENT_PREINTEGRATIONOFF catkin config --merge-develcd src git…

《量子十年》报告更新!IBM精研量子计算,助力行业优化转型

近日,IBM商业价值研究院(IBM Institute for Business Value,简称IBV)精心出版了一本引人入胜的报告,《量子十年》第四版。这不仅是一本值得一读的书籍,更是对当前行业发展状况的全面总结和重要补充。 这部由…

Linux | Ubuntu安装pylsl

PYNQ开发中使用pylsl过程记录 操作系统为 Linux pynq 5.15.19-xilinx-v2022.1 #1 SMP PREEMPT Mon Apr 11 17:52:14 UTC 2022 armv7l armv7l armv7l GNU/Linux 使用 pip install pylsl 安装后在导入包的过程中会遇到如下错误: RuntimeError: LSL binary library f…

如何实现跨标签页通讯

什么是跨标签页通讯 同一浏览器,可以打开多个标签页,跨标签页通讯就是,一个标签页能够发消息给另一标签页。 有哪些实现方案 localStorage (window.onstorage事件监听)BroadcastChannel(广播&#xff09…

redis在springboot项目中的应用

一,将查询结果放到redis中作为缓存,减轻mysql的压力。 只有在数据量大的时候,查询速度慢的时候才有意义。 本次测试的数据量为XXX. 测试代码: 功能为根据昵称进行模糊匹配。 GetMapping("/get-by-nick")public String getNickN…

【算法专题突破】--- 位运算 --- 丢失的数字(难度⭐) 只出现一次的数字 III (难度⭐⭐) 消失的两个数字(难度⭐⭐⭐)(2)

一,丢失的数字 1. 题目解析 题目链接:268. 丢失的数字 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 2.算法原理 首先,我们设定一个长度为n的数组。理想情况下,如果这个数组是从…

机器人路径规划:基于鳑鲏鱼优化算法(Bitterling Fish Optimization,BFO)的机器人路径规划(提供MATLAB代码)

一、机器人路径规划介绍 移动机器人(Mobile robot,MR)的路径规划是 移动机器人研究的重要分支之,是对其进行控制的基础。根据环境信息的已知程度不同,路径规划分为基于环境信息已知的全局路径规划和基于环境信息未知或…

CSDN学习笔记总索引(2024)——我的创作纪念日(1024)

从2021-05-21至2024-03-19,我的CSDN博文学习笔记中,收集并展示浏览阅读,点赞收藏评论等数据,以浏览阅读量排逆序展示。 (笔记模板由python脚本于2024年03月19日 05:49:24创建,本篇笔记适合熟悉Python,对其基…

一维数组数组名的用途

大家好&#xff1a; 衷心希望各位点赞。 您的问题请留在评论区&#xff0c;我会及时回答。 一、数组名的用途 一维数组数组名的用途&#xff1a; 1、可以统计整个数组的长度。 2、可以获取数组在内存中的首地址。 二、示例代码 #include <iostream> #include <W…

亚马逊等跨境电商平台自养号测评的五个核心因素

一、安全稳定的环境系统 尽管市场上存在大量现成的系统和软件包&#xff0c;卖个软件或设备给你&#xff0c;这种基本上都没有解决风控的能力&#xff0c;因此&#xff0c;小编推荐大家还是自己掌握相关技术&#xff0c;避免过度依赖于外部资源&#xff0c;目前&#xff0c;也…

C语言救赎之路,有些鸟儿是困不住的!(其4) (逻辑运算符+函数)

什么是运算符&#xff1f;诶~&#xff0c;其实我们一直在用运算符&#xff0c;比如我们的 &#xff0c;-&#xff0c;*&#xff0c;/ 等等都是运算符。今天我们就先来讲讲运算符。这是结合我自己的理解&#xff0c;我认为自己讲的肯定比一些教科书讲的要更清楚一些&#xff0c;…

SpringBoot整合Xxl-Job

一、下载Xxl-Job源代码并导入本地并运行 Github地址:GitHub - xuxueli/xxl-job: A distributed task scheduling framework.&#xff08;分布式任务调度平台XXL-JOB&#xff09; 中文文档地址:分布式任务调度平台XXL-JOB 1.使用Idea或Eclipse导入 2.执行sql脚本(红色标记…

nfs介绍与配置

NFS 1. nfs简介 nfs特点 NFS&#xff08;Network File System&#xff09;即网络文件系统&#xff0c;是FreeBSD支持的文件系统中的一种&#xff0c;它允许网络中的计算机之间通过TCP/IP网络共享资源在NFS的应用中&#xff0c;本地NFS的客户端应用可以透明地读写位于远端NFS服…

动态规划课堂6-----回文串问题

目录 引言&#xff1a; 例题1&#xff1a;回文子串 例题2&#xff1a;回文串分割IV 例题3&#xff1a;分割回文串II 例题4&#xff1a;最长回文子序列 例题5&#xff1a;让字符串成为回文串的最小插入次数 引言&#xff1a; 回文字符串 是正着读和倒过来读一样的字符串。…

LeetCode 面试经典150题 80.删除有序数组中的重复项II

题目&#xff1a; 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件…