共计 3928 个字符,预计需要花费 10 分钟才能阅读完成。
本文简介
这次要讲的是 4 个“摆正”元素的办法 ,这是我工作中遇到的场景。
我不晓得 straighten
应用“摆正”这个词来翻译正不正确,反正我就是要这么叫!
straighten
:依据间隔的远近,将元素从以后角度旋转至 0、90、180、270 等角度。
【百度百科的定义】
straighten,英文单词,及物动词、不及物动词,作及物动词时意为“整顿;使…改过;使…挺直;使…恶化”,作不及物动词时意为“变直;恶化”。
英语课代表的揭示~
成果如下图所示
版本阐明
Fabric.js 版本:4.6.0
相干 API
Fabric.js
提供了几个 API 实现 摆正操作 :
canvas.straightenObject(object)
object.straighten()
canvas.fxStraightenObject(object)
object.fxStraighten()
须要留神的是,应用 object.straighten
和 object.fxStraighten
摆正元素后,画面是不会自动更新的(但理论是曾经摆正了),须要配合 canvas.renderAll()
等刷新画布的 API 一起应用。
这点官网文档上如同没有特地阐明。
下面 4 个 API 中,带 fx
的是有过渡动画成果的。
示例代码
接下来的代码里,应用到的 元素对象
我都在公共变量里定义好的。
如果须要动静获取指定元素,你能够应用 canvas.getObjects()
、getActiveObject()
等办法,这依据你业务场景来定。
这些办法都不是本文想解说的重点,所以当初先回归到原来的目标吧。
办法 1:canvas.straightenObject
canvas.straightenObject
这个办法容许咱们传入 1 个参数。这个参数是你须要摆正的元素对象 (fabric.Object
)。
我用一个 三角形 来举例。逻辑都写在代码正文里。
<button onclick="straightenObject()"> 摆正元素 </button>
<canvas id="canvasBox" width="600" height="600"></canvas>
<!-- 引入 fabric.js -->
<script src="https://cdn.bootcdn.net/ajax/libs/fabric.js/460/fabric.min.js"></script>
<script>
let canvas = null // 画布对象
let triangle = null // 三角形对象
window.onload = function() {
// 初始化画布
canvas = new fabric.Canvas('canvasBox', {
width: 400,
height: 400
})
// 三角形
triangle = new fabric.Triangle({
top: 100,
left: 100,
width: 80, // 底边长度
height: 100, // 底边到对角的间隔
fill: 'blue',
angle: 30 // 旋转了 30 度
})
// 将矩形增加到画布中
canvas.add(triangle)
}
// 摆正
function straightenObject() {
// 传入三角形对象
canvas.straightenObject(triangle)
}
</script>
办法 2:object.straighten
应用 object.straighten
也能达到 canvas.straightenObject
的成果。
但 object.straighten
并不会主动刷新画布,须要应用 canvas.renderAll()
等办法配合。
<!-- 省略局部代码 -->
<script>
// 摆正
function straightenObject() {
// 三角形对象调用 straighten 办法,从而摆正本身
triangle.straighten()
// 摆正完,须要刷新画布
canvas.renderAll()}
</script>
办法 3:canvas.fxStraightenObject
后面两个办法都是没过渡成果的。
接下来就试试有过渡成果的 API:canvas.fxStraightenObject
。
和 canvas.straightenObject
一样,canvas.fxStraightenObject
也须要传入一个 对象参数 (fabric.Object
)。
<button onclick="fxStraightenObject()"> 摆正元素(过渡动画)</button>
<canvas id="canvasBox" width="600" height="600"></canvas>
<!-- 引入 fabric.js -->
<script src="https://cdn.bootcdn.net/ajax/libs/fabric.js/460/fabric.min.js"></script>
<script>
let canvas = null // 画布对象
let triangle = null // 三角形对象
window.onload = function() {
// 初始化画布
canvas = new fabric.Canvas('canvasBox', {
width: 400,
height: 400
})
// 三角形
triangle = new fabric.Triangle({
top: 100,
left: 100,
width: 80, // 底边长度
height: 100, // 底边到对角的间隔
fill: 'blue',
angle: 30 // 旋转了 30 度
})
// 将矩形增加到画布中
canvas.add(triangle)
}
// 摆正
function fxStraightenObject() {
// 传入三角形对象
canvas.fxStraightenObject(triangle)
}
</script>
canvas.fxStraightenObject
不须要应用额定的办法刷新画布。
办法 4:object.fxStraighten
应用 object.fxStraighten
也能够实现带过渡动画的摆正性能。
但 object.fxStraighten
有点特地,它也能传入 1 个参数,该参数是个对象,对象外面有 2 个函数字段。
onComplete
:动画实现后的回调函数onChange
:动画执行过程中的回调函数
用法如下所示
<!-- 省略局部代码 -->
<script>
// 摆正
function fxStraightenObject() {
// 传入三角形对象
triangle.fxStraighten({onChange() {canvas.renderAll()
},
onComplete() {canvas.renderAll()
}
})
}
</script>
我的想法
- 如果要摆正的元素数量不多,能够应用
canvas.straightenObject
或canvas.fxStraightenObject
。 - 如果元素数量比拟多,应用
object.straighten
把元素都放好,而后再执行一次canvas.renderAll()
,刷新一次即可。 - 如果元素数量比拟多,应用
object.fxStraighten
时,如果不须要在回调函数里执行什么操作,能够应用requestAnimationFrame
的办法个体刷新。
下面第 3 点的代码
<button onclick="fxStraightenObject()"> 摆正元素(过渡动画)</button>
<canvas id="canvasBox" width="600" height="600"></canvas>
<script src="https://cdn.bootcdn.net/ajax/libs/fabric.js/460/fabric.js"></script>
<script>
let canvas = null // 画布对象
let triangle = null // 三角形对象
let rect = null // 矩形对象
window.onload = function() {
// 应用 元素 id 创立画布,此时能够在画布上框选
canvas = new fabric.Canvas('canvasBox', {
width: 400,
height: 400
})
// 三角形
triangle = new fabric.Triangle({
top: 100,
left: 100,
width: 80, // 底边长度
height: 100, // 底边到对角的间隔
fill: 'blue',
angle: 30
})
// 矩形
rect = new fabric.Rect({
top: 70,
left: 200,
width: 100, // 宽
height: 30, // 高
fill: 'orange',
angle: -40
})
// 将矩形增加到画布中
canvas.add(triangle, rect)
renderAll()}
// 一直刷新画布
function renderAll() {canvas.renderAll()
requestAnimationFrame(renderAll)
}
// 摆正(带过渡动画)function fxStraightenObject() {triangle.fxStraighten() // 摆正三角形
rect.fxStraighten() // 摆正矩形}
</script>
这种写法只是想提供一种思路,实在开发须要依据你业务进行灵便调整。
代码仓库
- 原生形式实现 摆正元素(带过渡动画)
- 在 Vue3 中应用 Fabric 实现 摆正元素(带过渡动画)
举荐浏览
- ⭐《Fabric.js 从入门到收缩》
- ⭐《Fabric.js 3 个 api 设置画布宽高》
- ⭐《Fabric.js 自定义右键菜单》
点赞 + 关注 + 珍藏 = 学会了