上一篇我们解决了能传这一篇要解决传哪。同样一张图片碰左边进素材库碰中间进画布碰右边进属性区——坐标到底是怎么变成业务落点的先讲个我调试时遇到的事。我把CrossDrop工作台分成了三个区域左边素材库中间编辑画布右边属性面板。代码写好以后拿手机一碰——嘿不管碰哪图片全进了素材库。我当时就懵了。系统明明给了触点坐标为什么区域判断全错后来打日志才发现系统给的坐标是屏幕坐标我拿它直接和组件坐标比差了整整一个标题栏的高度。就这一个坑调了一下午。一、先搞清楚四种坐标根本不是一回事我们日常说坐标好像就是一个(x,y)。但在窗口系统里至少有四种坐标每两种之间都差着偏移量第一种——屏幕坐标。整个显示器左上角是(0,0)你碰屏幕哪一点系统返回的就是这个坐标。这个坐标是全局的不管你开了几个窗口它都是相对于整个屏幕算的。第二种——窗口坐标。相对于当前窗口的左上角。窗口标题栏、边框这些算进去没有不同系统不一样。窗口在屏幕上移了这个坐标会不会变不会它是窗口内部的。第三种——页面坐标。相对于应用内容区域。状态栏、标题栏、导航栏这些都不算从真正的内容区域开始算。第四种——组件局部坐标。相对于某个具体组件的左上角。素材库有自己的坐标画布有自己的坐标。你看从屏幕上哪一点到哪个组件的哪一块中间要换算四层。少算任何一层结果都是错的。二、一步一步拆触点坐标怎么变成业务落点我们拿一个具体例子走一遍。假设用户碰屏幕位置是(x300, y200)。第一步屏幕坐标 → 窗口坐标先知道这个触点落在哪个窗口里。系统会告诉你这个点属于CrossDrop主窗口。窗口在屏幕上的位置是(offsetX100, offsetY50)。那窗口内部坐标就是窗口内x 300 - 100 200窗口内y 200 - 50 150这一步你得问窗口要它的位置。窗口移了位置变了换算公式就要跟着变。第二步窗口坐标 → 页面坐标窗口里不是全是内容。上面有标题栏左边有侧边栏。标题栏高度是40px。那内容区域的起点就是y40。页面坐标页面x 200假设左边没有边距页面y 150 - 40 110这一步最容易漏。我第一次调的时候就忘了减标题栏高度结果所有区域判断都往下偏了一截。第三步页面坐标 → 组件区域判断现在知道了内容区域里的位置接下来判断落在哪个业务区域。CrossDrop工作台布局大概是这样左边素材库x从0到250中间画布x从250到750右边属性区x从750到1000页面x200小于250那就是落在素材库区域。碰中间画布位置x大概是500落在250~750之间那就是插入画布。碰右边属性区x大概是800大于750那就是进入待处理资源区。这段代码解决什么问题坐标转换工具。文件coordinate/CoordinateConverter.ets用途系统坐标转应用业务坐标接入位置触点事件回调后classCoordinateConverter{// 窗口在屏幕上的偏移privatewindowOffsetX:number0;privatewindowOffsetY:number0;// 标题栏高度privatetitleBarHeight:number40;// 更新窗口位置updateWindowPosition(offsetX:number,offsetY:number){this.windowOffsetXoffsetX;this.windowOffsetYoffsetY;}// 屏幕坐标 → 页面内容坐标toContentCoordinate(screenX:number,screenY:number):{x:number;y:number}{return{x:screenX-this.windowOffsetX,y:screenY-this.windowOffsetY-this.titleBarHeight};}}第四步组件区域匹配光知道坐标落在哪个大块还不够还要知道具体是哪个组件。这时候有两种做法做法一自己算边界。每个区域记录自己的位置和尺寸判断坐标在不在这个矩形里。做法二用系统的HitTest。让ArkUI自己做命中测试直接返回落在哪个组件上。自己算的好处是可控坏处是布局变了边界也要跟着改。HitTest的好处是自动跟随布局坏处是有时候你想要的业务区域和组件边界不完全一致。这段代码解决什么问题区域匹配判断。文件router/RegionMatcher.ets用途根据坐标判断业务落点接入位置坐标转换完成后interfaceRegion{id:string;name:string;x:number;y:number;width:number;height:number;handler:string;}classRegionMatcher{privateregions:Region[][];addRegion(region:Region){this.regions.push(region);}match(x:number,y:number):Region|null{for(letregionofthis.regions){if(xregion.xxregion.xregion.widthyregion.yyregion.yregion.height){returnregion;}}returnnull;}}// 使用constmatchernewRegionMatcher();matcher.addRegion({id:material,name:素材库,x:0,y:0,width:250,height:800,handler:add_material});matcher.addRegion({id:canvas,name:编辑画布,x:250,y:0,width:500,height:800,handler:insert_canvas});matcher.addRegion({id:property,name:属性区,x:750,y:0,width:250,height:800,handler:add_pending});三、坐标这块最容易踩的坑坐标转换看起来简单实际全是细节。我踩过的坑列一下第一个坑状态栏高度没算。系统返回的坐标到底算不算状态栏不同设备不一样。手机和PC不一样横屏和竖屏也不一样。这个要实测别想当然。第二个坑窗口标题栏偏移。PC上窗口有标题栏你是从窗口边框开始算还是从客户区开始算这个差几个像素判断就错了。第三个坑缩放比例。有些设备有屏幕缩放比如125%缩放。你拿到的坐标是物理像素还是逻辑像素这个一定要搞清楚。第四个坑窗口移动了。用户把窗口从左边拖到右边你还在用旧的窗口偏移量算结果全错。所以窗口位置变化的时候要监听并更新。第五个坑横竖屏切换。手机竖屏和横屏窗口尺寸完全变了。区域边界也要跟着重算。第六个坑自由窗口尺寸变了。PC上用户可以拖窗口边缘调整大小窗口尺寸变了你的区域边界也要重新布局。第二篇总结坐标转换这件事核心不是写几行换算代码而是搞清楚四种坐标之间的层级关系屏幕坐标 → 窗口坐标 → 页面坐标 → 组件局部坐标。每一层都有自己的偏移量少算一层结果就错。工程上最容易翻车的不是算法是细节状态栏高度、标题栏偏移、缩放比例、窗口移动、横竖屏切换——这些环境变量任何一个变了你的坐标换算就要跟着变。下一篇我们把难度再往上提一级PC上同时开了三个窗口用户碰屏幕的时候怎么知道他碰的是哪个窗口
企业数字化 ERP 产品动态
相关推荐
万网可以做网站吗新手入门避坑:防黑挂马实操指南 万网可以做网站吗新手入门避坑:防黑挂马实操指南 网站被黑挂马,后台却查不到日志?别慌,这种“幽灵入侵”专挑新手管理者的网站下手。很多刚接触【万网可以做网站吗】的朋友,以为买了域名和服务器就万事大吉,结果上线三天,首页变赌博广告,SEO权重清… · 2026/9/27 3:50:04
SFF-8472与DDM深度解析:光模块数字诊断协议与运维实战指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 3:50:04
SQL注入实验笔记 一、环境搭建1.1 安装mycli使用mycli工具连接MariaDB数据库。mycli是一个SQL命令行客户端,支持自动补全和语法高亮。1.2 创建user数据库连接数据库后,查看现有数据库列表,确认user数据库已创建。1.3 往表中插入数据切换到user数据库ÿ… · 2026/9/27 3:50:04
硬件架构系统学习指南:从数字电路到微架构的完整路径 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 4:34:54
做soho怎么建立网站:3步搞定域名服务器与性能优化 做soho怎么建立网站:3步搞定域名服务器与性能优化 做SOHO建站,最让人头疼的不是设计,而是 域名服务器搞不懂 ,以及网站上线后打开像蜗牛一样慢。很多新手刚起步,预算有限,却容易被各种技术名词绕晕,导致网站不仅没带来流量,反而因为… · 2026/9/27 4:34:54
STM32F103与CS1237高精度称重采集实战:从硬件连接到代码调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 4:34:48
CATIA二次开发实战:Automation、CAA与EKL选型与避坑指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 4:34:35
一般用网站服务器图解步骤避坑指南 一般用网站服务器图解步骤避坑指南 域名解析报错,服务器连不上,后台配置全是英文,这大概是新手建站最崩溃的时刻。很多设计师转前端的朋友,明明页面画得漂漂亮亮,代码也写得规规矩矩,一碰到部署就抓瞎。别慌,咱们把“一般用网站服务器”这件事拆开了揉… · 2026/9/27 4:34:35
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01