Canvas库 KonvaJS入门 2坐标体系总结

news/2024/11/17 22:16:28/

Canvas库 KonvaJS入门 2坐标体系总结

  • 一、 准备环境
  • 二、konvasJS坐标基本使用演示
    • 1. 按坐标放置控件
    • 2. 移动group
    • 3. 父元素 scale 变化
    • 4. 子元素scale变化
    • 5. 旋转

一、 准备环境

KonvaJS的几个属性值与坐标都有关系,有时候不容易分清坐标如何计算,本文作个简单总结。
为调试方便,本文直接html引用 konvasjs库。
在这里插入图片描述

二、konvasJS坐标基本使用演示

1. 按坐标放置控件

<!DOCTYPE html>
<html><head><script src="https://unpkg.com/konva@8.3.14/konva.min.js"></script><meta charset="utf-8" /><title>Konva Drag and Drop a Group Demo</title><style>body {margin: 0;padding: 0;overflow: hidden;background-color: #f0f0f0;}</style></head><body><div id="container"></div><script>var width = window.innerWidth;var height = window.innerHeight;var stage = new Konva.Stage({container: 'container',width: width,height: height,});var shapesLayer = new Konva.Layer();var group = new Konva.Group({draggable: true,});var colors = ['red', 'orange', 'yellow', 'green', 'blue', 'purple'];for (var i = 0; i < 6; i++) {var box = new Konva.Rect({x: i * 30 + 10,y: i * 18 + 20,width: 100,height: 50,name: colors[i],fill: colors[i],stroke: 'black',strokeWidth: 0,});group.add(box);}function printLog(){const children = group.getChildren();console.info('group position', group.position());console.info('group absolutePosition', group.absolutePosition());console.info('group width', group.width());console.info('group height', group.height());console.info('group clipX', group.clipX());console.info('group getAbsoluteScale', group.getAbsoluteScale());console.info('group getClientRect', group.getClientRect());}shapesLayer.add(group);stage.add(shapesLayer);printLog();</script></body>
</html>

在这里插入图片描述
注意这时打印的坐标值:

group position {x: 0, y: 0}
group absolutePosition {x: 0, y: 0}
group width 0
group height 0
group clipX undefined
group getAbsoluteScale {x: 1, y: 1}
group getClientRect {x: 10, y: 20, width: 250, height: 140}
child0 position {x: 10, y: 20}
child0 absolutePosition {x: 10, y: 20}
child0 scale {x: 1, y: 1}
child0 width 100
child0 height 50

可以看到:

  • group的初始坐标全是0,因为group的坐标是相对于stage计算的;
  • group的width、height获取不到尺寸信息;
  • group可以通过getClientRect获取尺寸信息;

2. 移动group

给group添加事件:


<!DOCTYPE html>
<html><head><script src="https://unpkg.com/konva@8.3.14/konva.min.js"></script><meta charset="utf-8" /><title>Konva Drag and Drop a Group Demo</title><style>body {margin: 0;padding: 0;overflow: hidden;background-color: #f0f0f0;}</style></head><body><div id="container"></div><script>var width = window.innerWidth;var height = window.innerHeight;var stage = new Konva.Stage({container: 'container',width: width,height: height,});var shapesLayer = new Konva.Layer();var group = new Konva.Group({draggable: true,});var colors = ['red', 'orange', 'yellow', 'green', 'blue', 'purple'];for (var i = 0; i < 6; i++) {var box = new Konva.Rect({x: i * 30 + 10,y: i * 18 + 20,width: 100,height: 50,name: colors[i],fill: colors[i],stroke: 'black',strokeWidth: 0,});group.add(box);}function printLog(){const children = group.getChildren();console.info('group position', group.position());console.info('group absolutePosition', group.absolutePosition());console.info('child0 position', children[0].position());console.info('child0 absolutePosition', children[0].absolutePosition());}group.on('mouseover', function () {document.body.style.cursor = 'pointer';});group.on('mouseout', function () {document.body.style.cursor = 'default';});group.on('dragend',function(){printLog();});shapesLayer.add(group);stage.add(shapesLayer);printLog();</script></body>
</html>

初始位置:
在这里插入图片描述
移动整个组:
在这里插入图片描述
可以看出分组坐标的变化:

  • group在这里的position,absolutePosition值是相同的;
  • 初始group的position,absolutePosition都是{0,0};
  • 当移动分组时,分组的坐标是相对于起点在发生变化;

可以理解为:

  • 添加的新group,它的坐标起点都在左上角{0,0}处;
  • 移动group时,它的position,absolutePosition都是相对于上一层画布来计算的;这里的画面基础坐标是不会变的,所以两个属性值保持相等;
  • 子元素相对于group放置,它的{x,y}属性值一直相对于group起点来计算;
  • 子元素的absolutePosition是相对画布的真实坐标。

3. 父元素 scale 变化

测试代码:


<!DOCTYPE html>
<html><head><script src="https://unpkg.com/konva@8.3.14/konva.min.js"></script><meta charset="utf-8" /><title>Konva Drag and Drop a Group Demo</title><style>body {margin: 0;padding: 0;overflow: hidden;background-color: #f0f0f0;}</style></head><body><div id="container"></div><script>var width = window.innerWidth;var height = window.innerHeight;var stage = new Konva.Stage({container: 'container',width: width,height: height,});var shapesLayer = new Konva.Layer();var group = new Konva.Group({draggable: true,});var colors = ['red', 'orange', 'yellow', 'green', 'blue', 'purple'];for (var i = 0; i < 6; i++) {var box = new Konva.Rect({x: i * 30 + 10,y: i * 18 + 20,width: 100,height: 50,name: colors[i],fill: colors[i],stroke: 'black',strokeWidth: 0,});group.add(box);}function printLog(index){const children = group.getChildren();console.info('group position', group.position());console.info('group absolutePosition', group.absolutePosition());console.info('group width', group.width());console.info('group height', group.height());console.info('group clipX', group.clipX());console.info('group getAbsoluteScale', group.getAbsoluteScale());console.info('group getClientRect', group.getClientRect());if(!index){index=0;}console.info(`child${index} position`, children[index].position());console.info(`child${index} absolutePosition`, children[index].absolutePosition());console.info(`child${index} scale`, children[index].scale());console.info(`child${index} getAbsoluteScale`, children[index].getAbsoluteScale());console.info(`child${index} width`, children[index].width());console.info(`child${index} height`, children[index].height());}group.on('mouseover', function () {document.body.style.cursor = 'pointer';});group.on('mouseout', function () {document.body.style.cursor = 'default';});group.on('click tap', function(t){console.info('click target', t.target);group.scale({x:2});printLog(t.target.index);});group.on('dragend',function(){printLog();});shapesLayer.add(group);stage.add(shapesLayer);printLog();</script></body>
</html>

在这里插入图片描述
总结:

  • 父层group的scale变化,不会影响子元素 position 的值;
  • 父层group的scale变化,会影响子元素absolutePosition的值;
  • 父层group的scale变化,不会影响子元素scale的值;
  • 父层group的scale变化,不会影响子元素尺寸值;
  • 父层group的scale变化,会影响父元素getClientRect尺寸值;
  • 父层group的scale变化,会影响子元素absoluteScale值。

4. 子元素scale变化


<!DOCTYPE html>
<html><head><script src="https://unpkg.com/konva@8.3.14/konva.min.js"></script><meta charset="utf-8" /><title>Konva Drag and Drop a Group Demo</title><style>body {margin: 0;padding: 0;overflow: hidden;background-color: #f0f0f0;}</style></head><body><div id="container"></div><script>var width = window.innerWidth;var height = window.innerHeight;var stage = new Konva.Stage({container: 'container',width: width,height: height,});var shapesLayer = new Konva.Layer();var group = new Konva.Group({draggable: true,});var colors = ['red', 'orange', 'yellow', 'green', 'blue', 'purple'];for (var i = 0; i < 6; i++) {var box = new Konva.Rect({x: i * 30 + 10,y: i * 18 + 20,width: 100,height: 50,name: colors[i],fill: colors[i],stroke: 'black',strokeWidth: 0,});group.add(box);}function printLog(index){const children = group.getChildren();console.info('group position', group.position());console.info('group absolutePosition', group.absolutePosition());console.info('group width', group.width());console.info('group height', group.height());console.info('group clipX', group.clipX());console.info('group getAbsoluteScale', group.getAbsoluteScale());console.info('group getClientRect', group.getClientRect());if(!index){index=0;}console.info(`child${index} position`, children[index].position());console.info(`child${index} absolutePosition`, children[index].absolutePosition());console.info(`child${index} scale`, children[index].scale());console.info(`child${index} getAbsoluteScale`, children[index].getAbsoluteScale());console.info(`child${index} width`, children[index].width());console.info(`child${index} height`, children[index].height());}group.on('mouseover', function () {document.body.style.cursor = 'pointer';});group.on('mouseout', function () {document.body.style.cursor = 'default';});group.on('click tap', function(t){console.info('click target', t.target);// group.scale({x:2});t.target.scale({x:2});printLog(t.target.index);});group.on('dragend',function(){printLog();});shapesLayer.add(group);stage.add(shapesLayer);printLog();</script></body>
</html>

在这里插入图片描述
总结:

  • 子元素 scale 的变化 ,不会影响自身尺寸;

5. 旋转

在这里插入图片描述

  • 旋转时,width,height不会发生变化 ;
  • 父元素旋转时,子元素的{x,y}不会变化 , absolutePosition会发生变化 ;
  • 旋转是以左上角为中心;
  • 旋转后position和absolutePosition都不会发生变化

http://www.ppmy.cn/news/4211.html

相关文章

Linux C编程一站式学习笔记3

lLinux C编程一站式学习笔记 chap3 简单函数 文章目录lLinux C编程一站式学习笔记 chap3 简单函数一.数学函数C标准库和glibc二.自定义函数三.形参和实参Man Page习题四.全局变量、局部变量和作用域局部变量 local variable全局变量 global variable全局变量和局部变量重名的情…

C#基于ASP.NET的人事薪资管理系统

ASP.NET20003人事薪资管理系统,SQL数据库&#xff1a;VS2010开发环境,包含员工管理,部门管理,工资管理,绩效管理等功能,并且包含五险一金的计算 3.3 功能需求 3.3.1 员工部分 1&#xff1a;查看工资&#xff1a;以列表的形式查看系统现存的员工工资信息。 2&#xff1a;查看个…

如果你不是前端,一定不知道我在说什么

本文没有一句知识点&#xff0c;也没有一行代码&#xff0c;有的只是一些过家家似的内容&#xff0c;进而演变成的N个小朋友之间的对话。请原谅&#xff0c;如果你不是前端&#xff0c;可能你会不知道我在说什么&#xff0c;甚至觉得有些枯燥无味。 1、小A和小B 很久很久以前…

(文章复现)8.基于共享储能电站的工业用户日前优化经济调度

目录 复现文章&#xff1a; 摘要&#xff1a; 部分程序&#xff1a; 输出结果&#xff1a; 15r 复现文章&#xff1a; 基于共享储能电站的工业用户日前优化经济调度——李淋&#xff08;电力建设2020&#xff09; 摘要&#xff1a; 文章提出一种基于共享储能电站的工业…

论文笔记CATEGORICAL REPARAMETERIZATION WITH GUMBEL-SOFTMAX

目录Gumbel-Softmax分布Gumbel-Softmax EstimatorStraight-Through (ST) Gumbel-Softmax EstimatorStraight-Through Estimator (STE)Straight-Through (ST) Gumbel-Softmax Estimator参考Gumbel-Softmax分布 Gumbel-Softmax分布是一个定义在单纯形(simplex)上的连续分布。 Gu…

最全的SpringMVC教程,终于让我找到了

1. 为啥要学 SpringMVC&#xff1f; 1.1 SpringMVC 简介 在学习 SpringMVC 之前我们先看看在使用 Servlet 的时候我们是如何处理用户请求的&#xff1a; 配置web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmln…

【Anime.js】——用Anime.js实现动画效果

目录 目标&#xff1a; ​编辑1、确定思路 2、创建网格 3、设置随机位置 4、创建时间轴动画 完整代码&#xff1a; 目标&#xff1a; 实现自动选点&#xff0c;对该点进行先缩小后放大如何回到比其他点大一点的状态&#xff0c;并以该点从外向内放大 1、确定思路 2、创建网…

SOFA Weekly|Tongsuo 8.3.2 版本发布、C 位大咖说、本周 Contributor QA

SOFA WEEKLY | 每周精选 筛选每周精华问答&#xff0c;同步开源进展欢迎留言互动&#xff5e;SOFAStack&#xff08;Scalable Open Financial Architecture Stack&#xff09;是蚂蚁集团自主研发的金融级云原生架构&#xff0c;包含了构建金融级云原生架构所需的各个组件&#…