vue2+Fabric.js库的使用(7)--Fabric的画板项目完善1


前言

上两篇文章已经可以在画布上绘制基础的图形了,但是比较死板,没有其它的设置,如对画布的设置,对已经画好的对象的操作等,本篇文章还是,会针对这些问题,对这个项目进行完善


提示:以下是本篇文章正文内容,下面案例可供参考

一、画布的放大缩小

在选择按钮下面,通过滚动滚轮,实现画布的放大和缩小

          // 监听鼠标滚轮缩放事件
          'mouse:wheel': opt => {
            const delta = opt.e.deltaY // 滚轮,向上滚一下是 -100,向下滚一下是 100
            let zoom = this.canvas.getZoom() // 获取画布当前缩放值
            zoom *= 0.999 ** delta
            if (zoom > 20) zoom = 20 // 限制最大缩放级别
            if (zoom < 0.01) zoom = 0.01 // 限制最小缩放级别

            // 以鼠标所在位置为原点缩放
            this.canvas.zoomToPoint(
              { // 关键点
                x: opt.e.offsetX,
                y: opt.e.offsetY
              },
              zoom // 传入修改后的缩放级别
            )
          },

效果如下:
在这里插入图片描述

二、画布的平移

在选择按钮下面,通过按住Ctrl按键,鼠标左键按下,实现画布的移动

当鼠标按下的时候:

          // 是否按住alt,可以拖拽画布
          if (evt.altKey === true) {
              this.isDragging = true  // isDragging 是自定义的,开启移动状态
              this.lastPosX = evt.clientX
              this.lastPosY = evt.clientY
            }

当鼠标移动的时候:

          // 鼠标移动,移动画布
          if (this.isDragging) {
              let e = opt.e;
              let vpt = this.canvas.viewportTransform;
              vpt[4] += e.clientX - this.lastPosX
              vpt[5] += e.clientY - this.lastPosY
              this.canvas.requestRenderAll()
              this.lastPosX = e.clientX
              this.lastPosY = e.clientY
            }

当鼠标抬起的时候:

          // 关闭画布移动
          this.isDragging = false

效果如下:
在这里插入图片描述

三、删除元素

通过选中元素,点击delete按钮,可直接删除

选中元素

        //选中画布
        'selection:cleared': opt => {
          this.flagUp = false
        },
        //更换选中对象
        'selection:updated': opt => {
          this.flagUp = opt
        },
        //选中对象
        'selection:created': opt => {
          this.flagUp = opt
        }

监听键盘,删除选中的元素、对象

      //监听键盘事件
      document.addEventListener('keyup', e => {
        //当按下delete删除选中的对象
        if (this.flagUp && e.key === 'Delete') {
          //判断文字是否在编辑状态
          if (this.flagUp.selected[0].isEditing === true) return
          this.flagUp.selected.forEach(item => {
            this.canvas.remove(item)
          })
          //抛弃当前处于活动状态的Object
          this.canvas.discardActiveObject()
          this.flagUp = false
        }
      })

效果如下:
在这里插入图片描述

四、画布的放大缩小

在选择按钮下面,通过按住Ctrl按键,然后滚动滚轮,或者直接滚动滚轮,实现画布的放大和缩小

import numpy as np

五、画布的上一步、下一步

在进行删除等操作之后,可以通过上一步、下一步等操作恢复、撤销恢复画布中的对象

首先先把画面布局修改一下

在这里插入图片描述

      <!-- 操作按钮 -->
      <el-row @change="operationClickEvent">
        <el-button size="small" v-for="item in operationMenubarFun" :key="item.id" @click="operationClickEvent(item.name)" :title="item.title">{{ item.title }}</el-button>
      </el-row>

然后根据operationClickEvent方法,实现上一步和下一步

        case 'back':
          //需要将每次绘画的对象存在一个栈中,对栈顶的元素进行删除操作
          if (this.backStack.length == 0) return
          //要删除的对象
          let backObj = this.backStack[this.backStack.length - 1]
          this.canvas.remove(backObj)
          //将删除的元素存到删除栈中
          this.nextStack.push(backObj)
          //更改栈的长度
          this.backStack.length = this.backStack.length - 1
          this.canvas.requestRenderAll()
          break
        case 'next':
          //将删除的元素在压入栈顶
          if (this.nextStack.length == 0) return
          //将最后元素添加在画布中
          let nextObj = this.nextStack[this.nextStack.length - 1]
          this.canvas.add(nextObj)
          //将刚刚元素加入到back栈中
          this.backStack.push(nextObj)
          //改变栈的长度
          this.nextStack.length = this.nextStack.length - 1
          this.canvas.requestRenderAll()
          break
       
          //获取当前画布的宽和高
          this.form = {
            setWidth: this.canvas.getWidth(),
            setHeight: this.canvas.getHeight()
          }
          //显示设置
          this.dialogFormVisible = true
          this.canvas.requestRenderAll()
          break

效果如下:
在这里插入图片描述

六、对象的属性修改

1.修改属性

代码如下(示例):

<span class="top1">宽度:</span>
          <div><el-input v-model="borderWidth" @change="borderWidthChange" placeholder="请输入内容" size="small"></el-input></div>
          <span class="top1">边框颜色:</span>
          <div><el-color-picker v-model="borderColor" @change="borderColorChange" size="small"></el-color-picker></div>
      //全局属性设置
      borderWidthChange(value){
        this.borderWidth=value
      },
      borderColorChange(value){
        this.borderColor=value
      },

效果如下:
在这里插入图片描述

总结

关于vue2+Fabric.js库的使用就介绍到这里,后续可根据这个再自己进行优化,叠加功能

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值