参考:GitHub - briefness/fabric-region: 基于fabric.js的一个demo基于fabric.js的一个demo. Contribute to briefness/fabric-region development by creating an account on GitHub.icon-default.png?t=N7T8https://github.com/briefness/fabric-region

fabric不同版本的API也是不同,相同的API在不同的版本中,源码的实现方式有的也略微不同,所以请注意版本的区别

以下是比较早的版本,API会有不少的却别,请参考上面github里的demo

Fabric.js 用法总结

(在vue中使用时,因为this的指向不同,所以在Fabric.js方法内部,this是无法使用指向外部的值的)

这只是我在使用fabric.js的过程中的一些总结,文章底部有一个fabric入门的链接,新手入门可以先看一下,适合新手


1.

canvas.setBackgroundImage(require('../assets/logo.png'), canvas.renderAll.bind(canvas), {

    scaleY: 3,

    scaleX: 3

})

setBackgroundImage设置背景图片

scaleY,scaleX 设置图片的缩放比例

renderAll() 重新绘制,一般搭配clear()

2. var staticCanvas = new fabric.StaticCanvas('c');

创建无交互效果的canvas(和canvas效果一样)

3. var canvas = new fabric.Canvas('c');

创建有交互效果的canvascanvas.selection = false; // disable group selection

canvas无法被选中,也就是没有交互效果rect.set('selectable', false); // make object unselectable

设置其中的一个模块没有交互效果

设置多个对象无法选中(不可直接设置canvas.selection = false,是无效的,需要循环设置每个对象的selectable)

for (var i = 0; i < this.camerasIndex; i++) {

         this.fabricCanvas.item(i).selectable = false

}

4.移除event事件(off()方法),添加event事件(on()方法)

canvas.off('mouse:down')

canvas.on('mouse:down')

5. 对canvas添加了事件之后,也就是on方法之后,判定是否点中 object方法是

options.target

canvas.on('mouse:down', function (options) {

// 如果未选中对象,则继续创建,否则不再创建对象

    if (options.target === null) {

        var rect2 = new Fabric.fabric.Rect({

            width: 100,

            height: 100,

            left: 350,

            top: 250,

           fill: 'rgba(0,200,0,0.5)'

        })
    
        canvas.add(rect2)
    }

})

6.‘‘lockMovementX”,“lockMovementY”,“lockRotation”,“lockScalingX”,“lockScalingY”是锁定相应对象操作的属性。object.lockMovementX=true 防止对象被水平移动,但仍然可以垂直移动。

lockRotation 设置旋转

lockScalingX/ lockScalingY- 设置缩放

7.“hasControls”和“hasBorders”属性来控制对象的边框和顶点的可见性。只需设置它们为false并立即渲染“裸体”对象。

object.hasBorders = false; // 边框消失

object.hasControls = false; //顶点消失

8. 还可以通过调整“borderColor”,“cornerColor”和“cornerSize”属性来更改其外观。

object.set({ borderColor:'red', cornerColor:'green', cornerSize:6});

9. fabric.js和js一样是可以继承父类的

10.在fabric事件中无法获取外部变量时,转换变量即可

例:在Vue中,因为作用域的不同,this的指向也是不同的,所以无法获取this.value,只需要在事件外,把this转换掉即可

var gpoint = this

canvas.on('mouse:down', function (options) {

    console.log(gpoint.addModel)

}

11 . 设置canvas 的宽高

setHeight() 和 setWidth()

12. 对同一个canvas ID 进行多次获取,虽然获取的是同一个ID,但是会被判定重新实现,

所以必须获取一次,然后设置成全局变量,在其他地方,直接调用,不要重新获取

13. Fabric.js 的事件总结

1. mouse:down", "mouse:move", "mouse:up" 鼠标事件,分别是鼠标点击,鼠标移动,鼠标抬起

使用方法:canvas.on('mouse:down', function () {}) 后面的function是触发方法执行的内容

2. "object:modified", "object:selected", "object:moving", "object:scaling", "object:rotating", "object:added", and "object:removed"

对象事件,分别是对象的修改,选中,移动,伸缩,旋转,添加,删除

使用方法:canvas.on('object:selected', function () {}) 或者直接使用对象 object.on('selected', function () {}) object是添加的对象

例如:

fabricCanvas = this.__canvas = new Fabric.fabric.Canvas('myCanvas')

var rect = new Fabric.fabric.Rect({

    width: cameraAreaWidth,

    height: cameraAreaHeight,

    left: fabricThis.canvasX,

    top: fabricThis.canvasY,

    fill: 'rgba(102, 179, 255, 0.5)'
    
})

rect.on('selected', function () {})

14. 注意fabric.js的闭包问题,可以把for循环移至事件内部

15. 在vue 中,Image.fromURL() 方法绘制图片时,设置宽高,发布之后,图片宽高并未被等比缩放

fabric.Image.fromURL('my_image.png', function(oImg) { canvas.add(oImg);});

可以尝试fabric.Image() 的方法(并未确定是否可行,只是提供一个思路)

先在外部创建一个img,并设置好宽高,然后绘制,(注意,对于先创建img的问题,创建img 后的所有操作,都应在img加载完成后执行,否则无法获取到img)

var img = new Image()

// 初始化摄像头图标宽高

var cameraWidth = 25

// 摄像头图标初始化

var imgSrc = require('../../../../assets/images/camera.png')

img.src = imgSrc

img.style.width = cameraWidth + 'px'

img.style.height = cameraWidth + 'px'

// 监听img是否加载完毕,加载完毕后执行

img.addEventListener('load', function () {

    var img1 = new Fabric.fabric.Image(img, {

        left: fabricThis.canvasX - cameraWidth / 2,

        top: fabricThis.canvasY - cameraWidth / 2,

        width: cameraWidth,

        height: cameraWidth

    })
})

16.绘制完毕,需要绘制JSON.stringify(canvas)保存的信息,

调用canvas.loadFromJSON()方法即可,但是绘制出来的图像,仅是根据坐标大小绘制出的,并不是对象,

所以不存在添加事件。

如果想添加事件,需要根据JSON.stringify(canvas)里的数据重新组装成对象,然后重新绘制,

如果你向数据里添加了自己定义的字段,每次clear() 之后都需要重新添加一次,

也就是每次保存时,都需要把你需要的字段保存

17.扩展自己需要的信息

fabricGroup.toObject = (function (toObject) {

    return function () {

        return Fabric.fabric.util.object.extend(toObject.call(this), {

            id: this.id,

            cameraName: this.cameraName,

            cameraAddress:this.cameraAddress,

            switchStatus: this.switchStatus,

            inOutFlg: this.inOutFlg

        })

    }

})(fabricGroup.toObject)



gPoint.fabricCanvas.add(fabricGroup)

// 修改对象的 ID

fabricGroup.id = gPoint.formattedJson.objects[i].id

// 初始化上次保存的camera 的 name, address,switchStatus,inOutFlg

fabricGroup.cameraName = gPoint.formattedJson.objects[i].cameraName

fabricGroup.cameraAddress = gPoint.formattedJson.objects[i].cameraAddress

fabricGroup.switchStatus = gPoint.formattedJson.objects[i].switchStatus

fabricGroup.inOutFlg = gPoint.formattedJson.objects[i].inOutFlg

18. 对象选中时的样式设置为空

canvas.item(0).hasControls = canvas.item(0).hasBorders = false

19. 设置对象横纵方向不可移动

canvas.item(0).lockMovementX = true // 横向不可移动

canvas.item(0).lockMovementY = true // 纵向不可移动

19.把对象集合成一个组,对象的坐标是相对于组的中心点来计算的

例如:group 的 宽高为100px

那左上角的坐标为(-50,-50),右上角(50,-50)

左下角(-50,50),右下角(50,50)

其他坐标都可根据宽度计算出来

参考:http://jspang.com/2017/01/11/fabricjsbasic/ (官方文档的一个变相翻译,可以作为参考,里面还是有一些,看官方文档,容易忽略的内容,特别是英语不好的,而且里面有视频,也算是入门的一个方法)

Logo

前往低代码交流专区

更多推荐