IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 从零搭建低代码平台(八)实现预览区组件拖拽渲染生成辅助线的功能 -> 正文阅读

[游戏开发]从零搭建低代码平台(八)实现预览区组件拖拽渲染生成辅助线的功能

目录

大体介绍

具体思路

修改useBlockDragger.js函数

修改主函数对useBlockDragger.js函数的引用

预期结果


大体介绍

在上一篇文章中,我们实现了预览区组件的拖拽渲染的功能,在一篇文章中,我们将实现在组件拖拽的过程中形成辅助线的功能。(让组件更容易上下左右对齐的功能)。

具体思路

我们想要实现的辅助线,就是在一个组件靠近另一个组件的水平或竖直的顶、中、底的时候可以触发,形成一组水平或者是竖直的辅助线。我们在上一篇博客中所写的useBlockDragger.js函数中,接收了focusData数值,我们可以通过遍历所有的data值,与被选定的组件进行逐一的对比,从而实现生成辅助线的功能。

修改useBlockDragger.js函数

// 实现组件拖拽功能
import {reactive} from "vue";
import {events} from "@/packages/events";

export function useBlockDragger(focusData, lastSelectBlock) {
    let dragState = {
        startX: 0,
        startY: 0,
        dragging: false
    }
    let markLine = reactive({
        x: null,
        y: null
    })

    const mousedown = (e) => {
        if (focusData.value.focus[0].lock === false) {
            // e.dataTransfer.dropEffect = 'move';

            const {width: BWidth, height: BHeight} = lastSelectBlock.value;

            dragState = {
                startX: e.clientX,
                startY: e.clientY,
                startLeft: lastSelectBlock.value.left,
                startTop: lastSelectBlock.value.top,
                dragging: false,
                startPos: focusData.value.focus.map(({top, left}) => ({top, left})),
                lines: (() => {
                    const {unfocused} = focusData.value;

                    let lines = {x: [], y: []};
                    unfocused.forEach((block) => {
                        const {top: ATop, left: ALeft, width: AWidth, height: AHeight} = block;
                        // 顶对顶辅助线
                        lines.y.push({showTop: ATop, top: ATop});
                        // 顶对底辅助线
                        lines.y.push({showTop: ATop, top: ATop - BHeight});
                        // 中对中辅助线
                        lines.y.push({showTop: ATop + AHeight / 2, top: ATop + AHeight / 2 - BHeight / 2});
                        // 底对顶辅助线
                        lines.y.push({showTop: ATop + AHeight, top: ATop + AHeight});
                        // 底对底辅助线
                        lines.y.push({showTop: ATop + AHeight, top: ATop + AHeight - BHeight});


                        // 左对左辅助线
                        lines.x.push({showLeft: ALeft, left: ALeft});
                        // 右对左辅助线
                        lines.x.push({showLeft: ALeft + AWidth, left: ALeft + AWidth});
                        // 中对中辅助线
                        lines.x.push({showLeft: ALeft + AWidth / 2, left: ALeft + AWidth / 2 - BWidth / 2});
                        // 右对右辅助线
                        lines.x.push({showLeft: ALeft + AWidth, left: ALeft + AWidth - BWidth});
                        // 左对右辅助线
                        lines.x.push({showLeft: ALeft, left: ALeft - BWidth});

                    });
                    return lines
                })()

            }
            document.addEventListener('mousemove', mousemove, {passive: false})
            document.addEventListener('mouseup', mouseup, {passive: false})
        }

    }
    const mousemove = (e) => {
        let {clientX: moveX, clientY: moveY} = e;

        if (!dragState.dragging) {
            dragState.dragging = true;
            events.emit('start');
        }

        let left = moveX - dragState.startX + dragState.startLeft;

        // console.log(moveX)
        // console.log(dragState.startX)
        // console.log(typeof(dragState.startLeft))

        let top = moveY - dragState.startY + dragState.startTop;

        //计算横线
        let y = null;
        let x = null;
        for (let i = 0; i < dragState.lines.y.length; i++) {
            const {top: t, showTop: s} = dragState.lines.y[i];
            if (Math.abs(t - top) < 5) {
                y = s;
                moveY = dragState.startY - dragState.startTop + t;
                break;
            }
        }
        for (let i = 0; i < dragState.lines.x.length; i++) {
            const {left: l, showLeft: s} = dragState.lines.x[i];
            if (Math.abs(l - left) < 5) {
                x = s;
                moveX = dragState.startX - dragState.startLeft + l;
                break;
            }
        }
        markLine.x = x;
        markLine.y = y;

        let durX = moveX - dragState.startX;
        let durY = moveY - dragState.startY;

        focusData.value.focus.forEach((block, idx) => {
            block.top = dragState.startPos[idx].top + durY;
            block.left = dragState.startPos[idx].left + durX;
            // console.log(block.top)
        })
    }

    const mouseup = (e) => {
        document.removeEventListener('mousemove', mousemove, {passive: false})
        document.removeEventListener('mousemove', mouseup, {passive: false})
        markLine.x = null;
        markLine.y = null;
        if (dragState.dragging) {
            events.emit('end');
            dragState.dragging = false
        }
    }
    return {
        mousedown,
        markLine
    }
}

在其中

????????????????????????// 顶对顶辅助线
? ? ? ? ? ? ? ? ? ? ? ?就是拿被选定组件的顶与靠近的组件顶来进行对比,差值小于5就会自动对齐。
? ? ? ? ? ? ? ? ? ? ? ? // 顶对底辅助线
? ? ? ? ? ? ? ? ? ? ? ? ?就是拿被选定组件的顶与靠近的组件底来进行对比,差值小于5就会自动对齐。
? ? ? ? ? ? ? ? ? ? ? ? // 中对中辅助线
? ? ? ? ? ? ? ? ? ? ? ? ?就是拿被选定组件的中间与靠近的组件中间来进行对比,差值小于5就会自动对齐。
? ? ? ? ? ? ? ? ? ? ? ? // 底对顶辅助线
? ? ? ? ? ? ? ? ? ? ? ??就是拿被选定组件的底与靠近的组件顶来进行对比,差值小于5就会自动对齐。
? ? ? ? ? ? ? ? ? ? ? ? // 底对底辅助线
? ? ? ? ? ? ? ? ? ? ? ??就是拿被选定组件的底与靠近的组件底来进行对比,差值小于5就会自动对齐。


? ? ? ? ? ? ? ? ? ? ? ? // 左对左辅助线
? ? ? ? ? ? ? ? ? ? ? ? ?就是拿被选定组件的左与靠近的组件左来进行对比,差值小于5就会自动对齐。
? ? ? ? ? ? ? ? ? ? ? ? // 右对左辅助线
? ? ? ? ? ? ? ? ? ? ? ? ?就是拿被选定组件的右与靠近的组件左来进行对比,差值小于5就会自动对齐。
? ? ? ? ? ? ? ? ? ? ? ? // 中对中辅助线
? ? ? ? ? ? ? ? ? ? ? ?就是拿被选定组件的中间与靠近的组件中间来进行对比,差值小于5就会自动对齐。
? ? ? ? ? ? ? ? ? ? ? ? // 右对右辅助线
? ? ? ? ? ? ? ? ? ? ? ? 就是拿被选定组件的右与靠近的组件右来进行对比,差值小于5就会自动对齐。
? ? ? ? ? ? ? ? ? ? ? ? // 左对右辅助线
? ? ? ? ? ? ? ? ? ? ? ?就是拿被选定组件的左与靠近的组件右来进行对比,差值小于5就会自动对齐。

修改主函数对useBlockDragger.js函数的引用

  // 实现获取焦点
        let {blockMousedown, focusData, containerMousedown, lastSelectBlock} = useFocus(data, copyContent, (e) => {
            mousedown(e)
            // console.log(JSON.stringify(attrs_style.value.attribute))
            // console.log(JSON.stringify(attrs_style.value.block))
        });

       

        // 实现组件拖拽功能
        let {mousedown, markLine} = useBlockDragger(focusData, lastSelectBlock);

预期结果

?

?

?

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-04-04 12:42:53  更:2022-04-04 12:44:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年10日历 -2024/10/28 10:36:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码