A
Air官方
点击总偏一点、画笔落点不对、菜单弹错位置——坐标偏移类 bug 看似小,实际很磨人,因为坐标链路长。这篇讲密度与旋转这两个最大变量,以及系统性排查法。
▍坐标链有多长
一次触摸的坐标旅行:屏幕物理坐标——系统投递事件(物理像素或 vp)——壳层接收——密度换算——框架坐标系(逻辑像素)——文档坐标(画布内容坐标)。每一跳都可能出错,偏移 bug 的排查本质是逐跳核对。
▍两大高发变量
密度换算:物理像素与逻辑像素(vp)的换算系数随设备变(不同屏幕密度不同)。错误模式:某处假设了固定系数(写死的缩放比)、两处换算不一致(一处换了一次另一处又换一次——双重换算是经典坑)、舍入方式不一致(截断与四舍五入差一像素,累积后可感)。旋转与折叠:宽高对调瞬间,若布局参数没同步,出现点击镜像偏移(点左边右边响应);折叠态的展开过程中窗口尺寸渐变,实时跟随不上的中间态偏移。
▍逐跳核对法
工具:应用暴露调试模式(在事件入口与关键转换点打印坐标与坐标系标识)。方法:一次点击,打印链路上各点坐标值,人工核算每跳换算是否正确(密度系数、原点位置)。多数偏移在链路打印下一轮现形。多点采样定量:屏幕四角加中心五点采样,测量偏移量的分布(固定偏移=平移错误;随位置线性变化=缩放错误;旋转型分布=坐标轴映射错误)——分布形态直接指向错误类型,这是视觉双通道纪律里的定量测量在坐标问题上的应用。
▍框架层的已知坑
高 DPI 舍入策略冲突(QPA 实录:Qt 的 DPI 取整与系统的密度值不齐,累积偏移);自绘控件的视口偏移(滚动后没减滚动量);手写笔与触摸的坐标系差异(笔的精度更高,同样的换算误差在笔上更显性)。
▍修复模式
统一坐标转换层(全应用一个换算函数,禁止各处自行换算);坐标系显式标注(每个接口注释清楚传的是物理还是逻辑坐标);旋转与折叠走统一回调刷新布局参数。
▍预防
坐标转换层的单测覆盖密度矩阵(几档典型系数)与形态矩阵(旋钮全组合),比事后修偏移便宜百倍。
更多真实移植案例,欢迎到 apps 板块翻看 56 篇《鸿蒙PC适配全记录》系列实录。
▍坐标链有多长
一次触摸的坐标旅行:屏幕物理坐标——系统投递事件(物理像素或 vp)——壳层接收——密度换算——框架坐标系(逻辑像素)——文档坐标(画布内容坐标)。每一跳都可能出错,偏移 bug 的排查本质是逐跳核对。
▍两大高发变量
密度换算:物理像素与逻辑像素(vp)的换算系数随设备变(不同屏幕密度不同)。错误模式:某处假设了固定系数(写死的缩放比)、两处换算不一致(一处换了一次另一处又换一次——双重换算是经典坑)、舍入方式不一致(截断与四舍五入差一像素,累积后可感)。旋转与折叠:宽高对调瞬间,若布局参数没同步,出现点击镜像偏移(点左边右边响应);折叠态的展开过程中窗口尺寸渐变,实时跟随不上的中间态偏移。
▍逐跳核对法
工具:应用暴露调试模式(在事件入口与关键转换点打印坐标与坐标系标识)。方法:一次点击,打印链路上各点坐标值,人工核算每跳换算是否正确(密度系数、原点位置)。多数偏移在链路打印下一轮现形。多点采样定量:屏幕四角加中心五点采样,测量偏移量的分布(固定偏移=平移错误;随位置线性变化=缩放错误;旋转型分布=坐标轴映射错误)——分布形态直接指向错误类型,这是视觉双通道纪律里的定量测量在坐标问题上的应用。
▍框架层的已知坑
高 DPI 舍入策略冲突(QPA 实录:Qt 的 DPI 取整与系统的密度值不齐,累积偏移);自绘控件的视口偏移(滚动后没减滚动量);手写笔与触摸的坐标系差异(笔的精度更高,同样的换算误差在笔上更显性)。
▍修复模式
统一坐标转换层(全应用一个换算函数,禁止各处自行换算);坐标系显式标注(每个接口注释清楚传的是物理还是逻辑坐标);旋转与折叠走统一回调刷新布局参数。
▍预防
坐标转换层的单测覆盖密度矩阵(几档典型系数)与形态矩阵(旋钮全组合),比事后修偏移便宜百倍。
更多真实移植案例,欢迎到 apps 板块翻看 56 篇《鸿蒙PC适配全记录》系列实录。
楼主
7 天前