本文简介

点赞 + 关注 + 珍藏 = 学会了


本文解说在 Fabric.js 中如何自在绘制椭圆形,如果你还不理解 Fabric.js,能够查阅 《Fabric.js从入门到精通》。

成果如下图所示



思路

Fabric.js 在初始化画布之后,能够执行框选操作,但默认是应用矩形的形式来框选,如下图所示:

我心愿应用鼠标创立椭圆的时候能够又一个椭圆的影子进去,这能让我更不便去察看以后要画的椭圆大略是什么样子。

所以咱们能够先把框选时的边框背景色设置成通明,而后再框选时监听鼠标点击、挪动、松开的事件,从而绘制出一个椭圆。


具体思路步骤如下:

  1. 将框选时边框和背景设为通明
  2. 鼠标点击时创立椭圆
  3. 鼠标挪动时批改椭圆尺寸
  4. 鼠标松开时生成正式的椭圆


我将整个绘制事件拆分成下面4步,但其实第3步还是有点难度的,咱们要思考几种状况:

  1. 点击时的坐标在挪动时的左下方
  2. 点击时的坐标在挪动时的左上方
  3. 点击时的坐标在挪动时的右上方
  4. 点击时的坐标在挪动时的右下方


这4种状况我在 《Fabric.js 自在绘制矩形》 里逐个剖析过,能够去看看(记得点个赞哦~)



编码

在理清思路后,咱们能够正式编码阶段。

我还是会依照1、2、3、4的步骤去编码,你在两个浏览器窗口中关上本文,一边是编码,一边是思路,对照着看可能会清晰点。

<canvas id="canvas" width="800" height="800"></canvas><script src="https://cdn.bootcdn.net/ajax/libs/fabric.js/521/fabric.js"></script><script>  let canvas = null  let currentType = 'default'  let downPoint = null  let upPoint = null  let currentEllipse = null // 长期椭圆  // 初始化画板  function initCanvas() {    canvas = new fabric.Canvas('canvas')    canvas.on('mouse:down', canvasMouseDown)   // 鼠标在画布上按下    canvas.on('mouse:move', canvasMouseMove)   // 鼠标在画布上挪动    canvas.on('mouse:up', canvasMouseUp)       // 鼠标在画布上松开  }  // 画布操作类型切换  function typeChange(opt) {    currentType = opt    switch(opt) {      case 'default':        // 默认框选模式        canvas.selection = true        canvas.selectionColor = 'rgba(100, 100, 255, 0.3)'        canvas.selectionBorderColor = 'rgba(255, 255, 255, 0.3)'        canvas.skipTargetFind = false // 容许选中        break      case 'ellipse':        // 椭圆模式        // 将框选时,边框和背景设为通明        canvas.selectionColor = 'transparent'        canvas.selectionBorderColor = 'transparent'        canvas.skipTargetFind = true // 禁止选中        break    }  }  // 鼠标在画布上按下  function canvasMouseDown(e) {    downPoint = e.absolutePointer    if (currentType === 'ellipse') {      currentEllipse = new fabric.Ellipse({        top: downPoint.y,        left: downPoint.x,        rx: 0,        ry: 0,        fill: 'transparent',        stroke: 'rgba(0, 0, 0, 0.2)'      })      canvas.add(currentEllipse)    }  }  // 鼠标在画布上挪动  function canvasMouseMove(e) {    if (currentType === 'ellipse' && currentEllipse) {      const currentPoint = e.absolutePointer      let rx = Math.abs(downPoint.x - currentPoint.x) / 2      let ry = Math.abs(downPoint.y - currentPoint.y) / 2      let top = currentPoint.y > downPoint.y ? downPoint.y : downPoint.y - ry * 2      let left = currentPoint.x > downPoint.x ? downPoint.x :  downPoint.x - rx * 2      // 设置椭圆尺寸和所在位置      currentEllipse.set('rx', rx)      currentEllipse.set('ry', ry)      currentEllipse.set('top', top)      currentEllipse.set('left', left)      // 刷新一下画布      canvas.requestRenderAll()    }  }  // 鼠标在画布上松开  function canvasMouseUp(e) {    upPoint = e.absolutePointer    if (currentType === 'ellipse') {      // 须要判断点击时和松开时鼠标的坐标点是否相等,相等的话就不创立椭圆了      if (JSON.stringify(downPoint) === JSON.stringify(upPoint)) {        canvas.remove(currentEllipse)      } else {        // 设置椭圆款式        currentEllipse.set('stroke', '#000')      }      // 革除长期创立的椭圆      currentEllipse = null    }  }  window.onload = function() {    initCanvas()  }</script>

从下面的代码能够看出,次要外围局部就是 “鼠标点击时,鼠标挪动时,松开鼠标后” 这几个环节。鼠标挪动时,要实时监听鼠标以后的坐标,松开鼠标后就不再监听。




代码仓库

⭐Fabric.js 自在绘制椭圆



举荐浏览

  • 《Fabric.js 自在绘制矩形》
  • 《Fabric.js 自在绘制矩形》
  • 《Fabric.js 自定义右键菜单》
  • 《Fabric.js 从入门到收缩》
  • 《Fabric.js 3个api设置画布宽高》

点赞 + 关注 + 珍藏 = 学会了