给konva加个刻度尺

news2024/11/24 19:47:17

给konva加个刻度尺

最近在用konva做一些,一开始写了不少辅助函数。帮助自己给物体定位 ,现在贡献出来给大家用。

给图层增加刻度尺

顾名思义就是加个刻度显示,效果如下:

image-20230424160401359

代码:
第一个参数时layer,第二个是精度,返回一个layer

   stage.add(HelperLayer(deviceUpLayer, 50));

全部代码如下:

export function HelperLayer(layer, precision = 50) {
    const height = layer.height();
    const width = layer.width();
    const offset = {x: layer.offsetX(), y: layer.offsetY()}
    const littleLine = precision / 10;

    //辅助网格层
    let helperLayer = new Konva.Layer();
    const x = new Konva.Arrow({
        points: [offset.x, offset.y, width - offset.y, offset.y],
        stroke: 'red',
        strokeWidth: 2,
        lineCap: 'round',
        lineJoin: 'round',
        fill: 'black',
    })
    for (let j = 1; j < 10; j++) {
        helperLayer.add(new Konva.Line({
            points: [offset.x + j * littleLine, offset.y, offset.x + j * littleLine, j === 5 ? offset.x + 15 : offset.x + 10],
            stroke: '#48f3cc',
            strokeWidth: 1,
        }))
    }
    const xLabel = new Konva.Text({
        x: width - 20,
        y: 0,
        text: 'x',
        fontSize: 20,
        fill: 'yellow',
    })
    const y = new Konva.Arrow({
        points: [offset.x, offset.y, offset.x, height - offset.x],
        stroke: 'red',
        fill: 'black',
        strokeWidth: 2,
        lineCap: 'round',
        lineJoin: 'round',
    })
    for (let j = 1; j < 9; j++) {
        helperLayer.add(new Konva.Line({
            points: [offset.x, offset.y + j * littleLine, j === 5 ? offset.y + 15 : offset.y + 10, offset.y + j * littleLine],
            stroke: '#48f3cc',
            strokeWidth: 1,
        }))
    }
    const yLabel = new Konva.Text({
        x: 10,
        y: height - 20,
        text: 'y',
        fontSize: 20,
        width: 100,
        fill: 'yellow',
    })
    helperLayer.add(x, y, xLabel, yLabel);

    helperLayer.add(new Konva.Text({
        x: offset.x,
        y: offset.y,
        text: "0,0",
        fontSize: 10,
        fill: 'yellow',
    }))

    // y轴刻度
    for (let i = 1; i < Math.floor(height / precision); i++) {
        helperLayer.add(new Konva.Line({
            points: [offset.x, i * precision + offset.y, 25, i * precision + offset.y],
            stroke: 'red',
            strokeWidth: 1,
        }))
        for (let j = 1; j < 9; j++) {
            helperLayer.add(new Konva.Line({
                points: [offset.x, i * precision + offset.y + j * littleLine, j === 5 ? offset.y + 15 : offset.y + 10, i * precision + offset.y + j * littleLine],
                stroke: '#48f3cc',
                strokeWidth: 1,
            }))
        }

        helperLayer.add(new Konva.Text({
            x: offset.x,
            y: i * precision + offset.y - 10,
            text: '' + i * precision,
            fontSize: 10,
            fill: 'yellow',
        }))
    }

    // x轴刻度
    for (let i = 1; i < Math.floor(width / precision); i++) {
        helperLayer.add(new Konva.Line({
            points: [i * precision + offset.x, offset.y, i * precision + offset.x, 25],
            stroke: 'red',
            strokeWidth: 1,
        }))
        for (let j = 1; j < 9; j++) {
            helperLayer.add(new Konva.Line({
                points: [offset.x + i * precision + j * littleLine, offset.y, offset.x + i * precision + j * littleLine, j === 5 ? offset.x + 15 : offset.x + 10],
                stroke: '#48f3cc',
                strokeWidth: 1,
            }))
        }
        helperLayer.add(new Konva.Text({
            x: i * precision + offset.x - 10,
            y: offset.y,
            text: '' + i * precision,
            fontSize: 10,
            fill: 'yellow',
        }))
    }

    return helperLayer;
}

拖动显示坐标

效果如下,当你做拖动元素的时候会自动显示该元素的坐标。

image-20230424160611856

实现如下:

第一个参数是需要拖动的元素,第二个参数是元素所在的图层,无返回值

function showCoord(node, layer) {
    node.on('dragmove', function (event) {
        if (event.target.coord) {
            event.target.coord.destroy()
        }
        event.target.coord = new Konva.Text({
            x: event.target.attrs.x,
            y: event.target.attrs.y + 10,
            text: `(${event.target.attrs.x},${event.target.attrs.y})`,
            fontSize: 20,
            fill: '#bcef63',
        });
        layer.add(event.target.coord);
    });
}

总结

代码很简单,其实也可以更近一步,但是我犯懒了。# 给konva加个刻度尺

最近在用konva做一些,一开始写了不少辅助函数。帮助自己给物体定位 ,现在贡献出来给大家用。

给图层增加刻度尺

顾名思义就是加个刻度显示,效果如下:

image-20230424160401359

代码:
第一个参数时layer,第二个是精度,返回一个layer

   stage.add(HelperLayer(deviceUpLayer, 50));

全部代码如下:

export function HelperLayer(layer, precision = 50) {
    const height = layer.height();
    const width = layer.width();
    const offset = {x: layer.offsetX(), y: layer.offsetY()}
    const littleLine = precision / 10;

    //辅助网格层
    let helperLayer = new Konva.Layer();
    const x = new Konva.Arrow({
        points: [offset.x, offset.y, width - offset.y, offset.y],
        stroke: 'red',
        strokeWidth: 2,
        lineCap: 'round',
        lineJoin: 'round',
        fill: 'black',
    })
    for (let j = 1; j < 10; j++) {
        helperLayer.add(new Konva.Line({
            points: [offset.x + j * littleLine, offset.y, offset.x + j * littleLine, j === 5 ? offset.x + 15 : offset.x + 10],
            stroke: '#48f3cc',
            strokeWidth: 1,
        }))
    }
    const xLabel = new Konva.Text({
        x: width - 20,
        y: 0,
        text: 'x',
        fontSize: 20,
        fill: 'yellow',
    })
    const y = new Konva.Arrow({
        points: [offset.x, offset.y, offset.x, height - offset.x],
        stroke: 'red',
        fill: 'black',
        strokeWidth: 2,
        lineCap: 'round',
        lineJoin: 'round',
    })
    for (let j = 1; j < 9; j++) {
        helperLayer.add(new Konva.Line({
            points: [offset.x, offset.y + j * littleLine, j === 5 ? offset.y + 15 : offset.y + 10, offset.y + j * littleLine],
            stroke: '#48f3cc',
            strokeWidth: 1,
        }))
    }
    const yLabel = new Konva.Text({
        x: 10,
        y: height - 20,
        text: 'y',
        fontSize: 20,
        width: 100,
        fill: 'yellow',
    })
    helperLayer.add(x, y, xLabel, yLabel);

    helperLayer.add(new Konva.Text({
        x: offset.x,
        y: offset.y,
        text: "0,0",
        fontSize: 10,
        fill: 'yellow',
    }))

    // y轴刻度
    for (let i = 1; i < Math.floor(height / precision); i++) {
        helperLayer.add(new Konva.Line({
            points: [offset.x, i * precision + offset.y, 25, i * precision + offset.y],
            stroke: 'red',
            strokeWidth: 1,
        }))
        for (let j = 1; j < 9; j++) {
            helperLayer.add(new Konva.Line({
                points: [offset.x, i * precision + offset.y + j * littleLine, j === 5 ? offset.y + 15 : offset.y + 10, i * precision + offset.y + j * littleLine],
                stroke: '#48f3cc',
                strokeWidth: 1,
            }))
        }

        helperLayer.add(new Konva.Text({
            x: offset.x,
            y: i * precision + offset.y - 10,
            text: '' + i * precision,
            fontSize: 10,
            fill: 'yellow',
        }))
    }

    // x轴刻度
    for (let i = 1; i < Math.floor(width / precision); i++) {
        helperLayer.add(new Konva.Line({
            points: [i * precision + offset.x, offset.y, i * precision + offset.x, 25],
            stroke: 'red',
            strokeWidth: 1,
        }))
        for (let j = 1; j < 9; j++) {
            helperLayer.add(new Konva.Line({
                points: [offset.x + i * precision + j * littleLine, offset.y, offset.x + i * precision + j * littleLine, j === 5 ? offset.x + 15 : offset.x + 10],
                stroke: '#48f3cc',
                strokeWidth: 1,
            }))
        }
        helperLayer.add(new Konva.Text({
            x: i * precision + offset.x - 10,
            y: offset.y,
            text: '' + i * precision,
            fontSize: 10,
            fill: 'yellow',
        }))
    }

    return helperLayer;
}

拖动显示坐标

效果如下,当你做拖动元素的时候会自动显示该元素的坐标。

image-20230424160611856

实现如下:

第一个参数是需要拖动的元素,第二个参数是元素所在的图层,无返回值

function showCoord(node, layer) {
    node.on('dragmove', function (event) {
        if (event.target.coord) {
            event.target.coord.destroy()
        }
        event.target.coord = new Konva.Text({
            x: event.target.attrs.x,
            y: event.target.attrs.y + 10,
            text: `(${event.target.attrs.x},${event.target.attrs.y})`,
            fontSize: 20,
            fill: '#bcef63',
        });
        layer.add(event.target.coord);
    });
}

总结

代码很简单,其实也可以更近一步,但是我犯懒了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/456900.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

居民配电所远程监控解决方案

一、项目背景 随着城市建设提速发展、能源利用日益提高、环保节能成为了城市发展的新趋势&#xff0c;配电站逐渐成为企业和居民生活中不可或缺的组成部分。居民的生活用电需求也日益增大。如果没有及时处理好用电安全很容易出现电力中断等情况发生。因此及时高效地为用电客户…

区域LIS源码,基于云计算B/S架构医学实验室检验系统源码

基于B/S架构的医学实验室检验系统源码&#xff0c;整个系统的运行基于WEB层面&#xff0c;只需要在对应的工作台安装一个浏览器软件有外网即可访问。全套系统采用云部署模式&#xff0c;部署一套可支持多家医院检验科共同使用。 采用.Net Core新的技术框架、DEV报表、前端js封…

CASS方格网法土石方量计算

1、打开软件&#xff0c;在“绘图处理”-“展野外测点点号”&#xff0c;默认比例尺为1:500&#xff0c;如下&#xff1a; 2、打开后&#xff0c;在命令行输入pl&#xff0c;绘制范围线&#xff0c;将所有点大致圈起来&#xff0c;如下&#xff1a; 展点结果 范围线绘制结果 3…

【软件测试面试】性能测试常问面试题?不备这些真不敢去面了...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试的应用领…

给图片加颜色边框怎么弄,3种好用方法

给图片加颜色边框怎么弄&#xff1f;图片是我们每个人平时都必不可少的文件之一&#xff0c;尤其是在工作中的使用&#xff0c;不同的使用场景对于图片的要求也是不一样的&#xff0c;这就要求我们具有一定的图片处理技能&#xff0c;现在任何事情都离不开电脑&#xff0c;所以…

操作系统原理 —— 进程状态切换具体做了哪些事情?(八)

什么是进程控制&#xff1f; 进程控制的主要功能是&#xff1a;对系统中的所有进程实施有效的管理&#xff0c;它具有创建新进程、撤销已有进程、实现进程状态转换等功能。 简单来说&#xff0c;就是进程控制就是要现实进程状态的转换。 那如何实现进程的控制呢&#xff1f;…

案例01-tlias智能学习辅助系统02-文件上传

4.6 文件上传 若要实现下方的文件上传页面&#xff0c;需要前后端做如下操作&#xff1a; 后端&#xff1a; 本地存储 云存储 阿里云官方文档说明 具体实现参考上方连接&#xff0c;不再详细说明 阿里云OSS快速入门请参考文档&#xff1a; AliOSS.md &#xff08;在talis文…

不同场景下的并发容器选择

在并发编程中&#xff0c;我们经常会使用容器来存储数据或对象&#xff0c;可以依据场景的变化选择多种容器。 Map并发容器 因为在 JDK1.7 之前&#xff0c;在并发场景下使用 HashMap 会出现死循环&#xff0c;从而导致 CPU 使用率居高不下&#xff0c;而扩容是导致死循环的主…

扫描电镜学习手册

SEM测试&#xff0c;在通俗意义上来讲&#xff0c;可以看成是一个放大倍数超级大的“放大镜”。 作为当今十分有用的科学研究仪器&#xff0c;扫描电子显微镜是介于透射电镜和光学显微镜之间的一种微观性貌观察手段&#xff0c;可直接利用样品表面材料的物质性能进行微观成像。…

eureka注册中心和RestTemplate

eureka注册中心和restTemplate的使用说明 eureka的作用 消费者该如何获取服务提供者的具体信息 1.服务者启动时向eureka注册自己的信息 2.eureka保存这些信息 3.消费者根据服务名称向eureka拉去提供者的信息 如果有多个服务提供者&#xff0c;消费者该如何选择&#xff1f; 服…

基于JavaSpringMVC+Mybatis+Jquery高校毕业设计管理系统设计和实现

基于JavaSpringMVCMybatisJquery高校毕业设计管理系统设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码…

CCBN 2023看点分析:国产8K摄像机国产化替代趋势增强

4月21日&#xff0c;为期3天的CCBN 2023&#xff08;第29届中国国际广播电视信息网络展览会&#xff09;在北京首钢会展中心圆满落幕&#xff0c;CCBN展会是亚洲广播电视设备展览会&#xff0c;也是中国广电行业规模最大、影响力最强的国际性展会之一&#xff0c;更是广电行业内…

Linux环境下(CentOS7)CC攻击——如何用CC攻击对网站进行压力测试(仅限于压力测试)

小编温馨提醒&#xff1a;请正确使用ddos攻击&#xff0c;不要用来做违反当地法律法规的事情&#xff0c;否则后果请自负&#xff01;&#xff01;&#xff01;&#xff01; 阿里云服务器链接 &#xff08;学生党可白嫖16个月ECS云服务器&#xff09; 高校计划 - 免费学生云…

通话蓝牙耳机什么牌子好?通话效果好的无线蓝牙耳机

这几年真无线蓝牙耳机市场发展迅速&#xff0c;从音质到续航再到现在的降噪能力&#xff0c;技术的不断进步也让厂家不断推陈出新&#xff0c;但是也导致许多人不知道从何选择&#xff0c;下面整理了几款通话效果不错的无线蓝牙耳机&#xff0c;可做参考。 一、南卡小音舱Lite…

1.栈的介绍-C语言调用函数(一)

目录 源代码变为可执行文件的过程 栈是什么 入栈过程 出栈过程 C语言函数调用栈 寄存器 EAX,EBX,ECX,EDX 寄存器使用约定 栈帧 调用的解释 释放的解释 堆栈操作 函数调用的操作 堆栈的主要指令 push/pop call/leave/ret 函数序和函数跋 我们在数据结构中学习…

事件抽取:Document-level Event Extraction via Parallel Prediction Networks

任务&#xff1a;给定一篇文章&#xff0c;从中提取出一个或多个结构化的事件 Y { y i } i 1 k Y\{y_i\}_{i1}^{k} Y{yi​}i1k​ ,其中每个事件 t t t事件类型 y i t y_{i}^{t} yit​表示是&#xff0c;包含一系列角色 ( r i 1 , r i 2 , . . . , r i n ) (r_{i}^{1},r_{i}^{…

构建高效数据中台——数据只有被使用起来,才能创造价值

产品经理们时常会碰到这种问题&#xff1a; 我刚上线一个功能&#xff0c;请研发同志们帮我拉个数据出来分析&#xff0c;却被残酷告知需要排期。 我这里急得跺脚&#xff0c;但也只能理解。 数据研发们每天有查不完的数据和写不完的表&#xff0c;业务部门要的数据迟迟拿不到&…

ABAP SM30自定义搜素帮助,且带出相关描述,也可回车带出。

本篇文章用SM30字段BUKRS带出BUTXT为例。 MODULE zfzhdm_f4help INPUT.DATA: lt_dynpfields1 TYPE STANDARD TABLE OF dynpread,ls_dynpfields1 TYPE dynpread,lt_return1 TYPE STANDARD TABLE OF ddshretval,ls_return1 TYPE ddshretval,lv_povstepl1 TYPE sy-stepl…

引领文旅新体验!实时云渲染助力打造“永不落幕”的湾区文采会元宇宙

2022年11月25日至27日&#xff0c;2022年粤港澳大湾区公共文化和旅游产品&#xff08;东莞&#xff09;采购会&#xff08;简称“湾区文采会”&#xff09;在广东省东莞市文化馆举行。 文采会期间&#xff0c;文采会元宇宙线上虚拟展厅全新亮相&#xff0c;这艘承载着科技与文化…

优秀的FAQ示例及FAQ页面制作技巧

在网页中问答设计中&#xff0c;虽然说客服会话更有人情味、解决效率更高&#xff0c;但从实际的客户使用情况和使用偏好来看&#xff0c;越来越多的人更喜欢自助服务。数据显示&#xff0c;约67%的受访者会优先选择自助服务&#xff0c;91%的客户使用过帮助中心来解决问题。可…