fabric.js图层换位,多对多

这篇博客探讨了如何在fabric.js环境中,针对四张图片的层级关系进行动态调整,使得0、1号图片可以作为一个组,分别替换到2、3号图片之上,同时保持它们原有的内部层级顺序。作者提出了利用fabric.Collection静态属性来实现这一目标,通过创建集合、移动对象、更新画布等步骤,成功实现了所需效果,避免了group对象带来的问题。
摘要由CSDN通过智能技术生成
例如有如下画布层级,四张图片 添加顺序分别为 0、1、2、3,越后面的层级越高,呈现出依次盖住的效果。
这里想实现0、1为一组然后换位置到2、3的上面,但是保持0、1的层级关系,如果直接用fabric提供的group对象进行层级上下移动会造成不能拆分的情况,而且就算拆分了group变为了原来的对象层级还是跟原来的一样

在这里插入图片描述

由此我想到了使用集合这个属性,fabric.Collection,这是一个静态属性,不需要new出来

下面copy出来我的代码

function up(index)为当前集合上移,function down(index)为当前集合下移
        function up(index) {
            let arr = fabric.Collection
            arr.add([canvas.getObjects()[0], canvas.getObjects()[1]])
            arr.add([canvas.getObjects()[2], canvas.getObjects()[3]])

            canvas.clear()
            let a = arr.item(index)
            arr.remove(arr.item(index))
            arr.insertAt(a, index + 1)

            arr.forEachObject(e => {
                canvas.add(...e)
            })

            // for (let i = 0; i < arr.size(); i++) {
            //     console.table(arr.item(i), ['id']);
            // }

            let length = arr.size()
            for (let i = 0; i < length; i++) {
                arr.remove(arr.item(0))
            }
            // console.table(canvas.getObjects(), ['id']);
        }

        function down(index) {
            let arr = fabric.Collection
            for (let i = 0; i < arr.size(); i++) {
                arr.remove(arr.item(i))
            }
            arr.add([canvas.getObjects()[0], canvas.getObjects()[1]])
            arr.add([canvas.getObjects()[2], canvas.getObjects()[3]])

            canvas.clear()
            let a = arr.item(index)
            arr.remove(arr.item(index))
            arr.insertAt(a, index - 1)

            arr.forEachObject(e => {
                canvas.add(...e)
            })

            // for (let i = 0; i < arr.size(); i++) {
            //     console.table(arr.item(i), ['id']);
            // }

            let length = arr.size()
            for (let i = 0; i < length; i++) {
                arr.remove(arr.item(0))
            }
            // console.table(canvas.getObjects(), ['id']);
        }
代码的思路的是:先把画布上的内容存放到集合中,再获取你点击到的组的索引,这时的结构应该是一个数组底下有两个数组对象:

在这里插入图片描述

假如点击的是group1,传入的值index为0,就是第一个表格的内容 id为 1和2的对象
这时对于集合也就是打印的数组来说,把第0个位置的数组对象先缓存然后在集合移除,只剩下了 id 3和4的对象,接着把之前缓存的数组对象给插入到集合 index+1 或者 index-1 的位置 【对应上移或者下移】,最后把整个集合里面的对象 依次添加到画布上就好啦。
在整个移除插入的过程之前先把画布内容存入集合再把整个画布之前的内容全部清空,再进行换位添加操作

最后实现如下效果:在这里插入图片描述

层级上 1、2对象跑到了3、4对象的上面 也就是在后面了,并且单图也是能进行操作的在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值