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, // 它指定是否启用控制(缩放),默认trueleft: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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

camunda 与 pycamunda学习

camunda 与 pycamunda 相关链接: camunda 官方社区:https://docs.camunda.org/manual/7.17/ 官方社区提供的REST_API:https://docs.camunda.org/manual/7.17/reference/rest/ GITHUB 社区:https://github.com/camunda-community-hub Git…

18.WEB渗透测试--抓包技术(上)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:17.WEB渗透测试--Kali Linux(五)-CSDN博客 网站协议抓包 1.BurpSuite Burp Suite 是用…

makefile基础与实战编译C++项目

从源码到执行程序 makefile运行流程 :这个符号用于在执行的命令之前,通常会告诉make不要输出命令本身,只输出命令的结果。但是当它位于命令行的开头时,它通常会让Make静默执行该命令,即不在命令行中显示该命令&#xf…

学习笔记-华为IPD转型2020:3,IPD的实施

3. IPD的实施 1999 年开始的 IPD 转型是计划中的多个转型项目中的第一个(Liu,2015)。华为为此次转型成立了一个专门的团队,从大约20人开始,他们是华为第一产业的高层领导。董事会主席孙雅芳是这个团队的负责人。该团…

MacBook使用——彻底卸载并删除软件:NTFS for Mac

问题 之前因MacBook读写NTFS格式移动硬盘,我安装并使用了 Paragon NTFS for Mac ,试用期结束后将其从【应用程序】中卸载移除了。但之后每次开机启动时,系统还是会弹出【激活】通知,如下图 解决 Step1、在用户目录下的 Library 目…

STM32中MicroLIB的关闭为什么会导致卡死----解析

STM32MicroLIB 大家好我是 MHZ 。最近又开始往回捡单片机的知识了~ 之前大学的时候都没用过 STM 的 CubeMX,这会拿来用着感觉很方便啊~ 果然科技在进步! 在开发使用 Keil 对 STM32 进行开发的时候在会有一个叫做 MicroLIB 的选项。 这个的具体原因我搜…

c++ 指针大小

C的一个指针占内存几个字节? 结论: 取决于是64位编译模式还是32位编译模式(注意,和机器位数没有直接关系) 在64位编译模式下,指针的占用内存大小是8字节在32位编译模式下,指针占用内存大小是4字…

联合和枚举

联合体类型的声明 联合体(Union)是一种特殊的数据类型,它允许在同一内存位置存储不同类型的数据。与结构体不同的是,联合体的所有成员共享同一块内存空间,因此联合体的大小取决于它最大的成员的大小。 所以联合体也叫…

基于python的变配电室运行状态评估与预警系统flask-django-nodejs-php

近年来,随着我国工业化、城镇化步伐的不断加快,城市配电网络取得令人瞩目的发展成果。变配电室是供配电系统的核心,在供配电系统中占有特殊的重要地位[1]。变配电室电气设备运行状态和环境信息缺乏必要的监测评估预警手段,如有一日遭遇突发情…

蓝桥杯之动态规划冲刺

文章目录 动态规划01背包小练一下01背包网格图上的DP完全背包 最长公共字符串最长递增子序列 动态规划 动态规划:确定好状态方程,我们常常是确定前 当状态来到 i 时,前 i 个物体的状态是怎么样的,我们并不是从一个点去考虑&#x…

Python爬虫获取接口数据

Python爬虫获取接口数据 正常人的操作​​​​​​​​​​爬虫的思路标题获取请求信息标题请求转换为代码完整代码请求返回信息执行程序获取静态网页数据的教程,适用于我们要爬取的数据在网页源代码中出现,但是还是有很多的数据是源代码中没有的,需要通过接口访问服务器来获…

【计算机组成】27、有符号数和无符号数

文章目录 int 是有符号数 uint 是无符号数 所以 int8 的 范围是 -128 到 127 uint8 的范围是 0 到 255 同样的二进制 1000-0000 如果用 uint8 解释则为 255,但如果用 int8 解释则为 -128 同样的二进制 0111-1111 如果用 uint8 解释则为 127,但如果用…

云蜜罐技术(德迅猎鹰)诞生

数字化程度高且高价值信息密集的行业,如金融、能源、互联网、政府、教育、医疗、军工等行业,面对日益规模化、专业化的网络攻击,渐渐不再满足于一味的防守加固。除了巩固防线之外,他们愈发看重主动出击、感知更大范围内的攻击&…

MySQL的概述与安装

一、数据库的基本概念: 1.1 数据: 1) 描述事物的符号记录称为数据(Data)。数字、文字、图形、图像、声音、档案记录等 都是数据。 2)数据是以“记录”的形式按照统一的格式进行存储的,而不是…

Ubuntu 如何安装 Beyond Compare?

Ubuntu20.04安装Beyond Compare 4.3.7 一、官网下载方式一:方法二:使用 .deb 包安装 二、安装相关依赖和bcompare三、破解常见错误解决方法 ) 文件比较工具Beyond Compare是一套由Scooter Software推出的文件比较工具。主要用途是对比两个文件夹或者文件…

2024-3-13,14(CSS)

1.复合选择器 有两个或者多个基础选择器,通过不同的方式组合而成。 目的是更加准确高效的选择目标元素(标签) 分类: 后代选择器:选中某个元素的所有后代元素 写法:父选择器 子选择器 {CSS属性}&#x…

【导论】数据可信流通 从运维信任到技术信任

信任 信任概念由于其抽象性和结构复杂性,在社会学、心理学、营销学、经济学、管理学等不同 的领域定义是不同的,但是达成共识的观点是:信任是涉及交易或交换关系的基础。 信任的基石 ①身份可确认,②利益可依赖,③能…

内网渗透学习-环境搭建

1、环境搭建测试 虚拟机网络环境配置,模拟外网和内网 主机操作系统网络内网ip外网ip物理主机window10vmnet8192.168.70.1攻击机kali Linuxvmnet8192.168.70.134域控主机win server 2008 r2vmnet0192.168.52.138域成员主机win server 2k3vmnet0192.168.52.141服务器…

ThingsBoard Edge 安装部署

文章目录 一、概述1.官方文档2.部署说明3.安装准备3.1. 克隆服务器3.2.安装 Docker3.3.安装 Java 113.4.安装 PostgreSQL3.5.下载安装包 二、安装部署1.创建 Edge 实例2.创建数据库3.Edge 服务安装3.1.安装服务3.2.配置 Edge3.3.运行安装脚本3.4.重新启动服务 4.访问 Edge5.故障…

C#,图论与图算法,图着色问题(Graph Coloring)的威尔士-鲍威尔(Welch Powell Algorithm)算法与源代码

Welsh, D.J.A. and Powell, M.B. (1967) An Upper Bound for the Chromatic Number of a Graph and Its Application to Timetabling Problems. 《The Computer Journal》, 10, 85-86. 《The Computer Journal》 1 图着色算法概述 1967年,Welsh和Powell算法引入了图色数的上…