浙江省台州市椒江区洪家经中路2267号 19270012647 k8com@j90001.com

公司动态

保持画面比例时黑边与点击坐标怎样计算:六种窗口的居中缩放与点击映射·案例21

2026-11-02

把一张固定比例的画面放进不同窗口,保持比例并完整显示时可能留下黑边。窗口坐标直接当作画面坐标,会让黑边区域的点击错误地落到有效内容里。

以下是一组可按记录复查的虚构游戏例子。它先固定输入、单位和执行顺序,再展示每一步结果。读者可以用纸笔挑出几步核对,不需要依赖具体游戏的后台数据。

明确规则与输入

源画面和窗口尺寸均为正整数,使用能完整容纳画面的最大等比缩放,居中放置。可视矩形左上包含、右下排除,黑边点击视为无效;内部点扣除边距再除缩放得到源坐标,计算时不提前取整。

六组窗口均完整显示源画面,四项边界按左、上、右、下排列。

完整计算过程

第1组源1280×720、窗口720×1080,缩放9/16,内容边界['0', '675/2', '720', '1485/2']。测试点[['0', '0'], ['360', '540'], ['0', '675/2'], ['720', '1485/2'], ['240', '945/2']],对应源坐标[None, ['640', '360'], ['0', '0'], None, ['1280/3', '240']];None表示落在内容矩形外。

第2组源800×480、窗口1080×800,缩放27/20,内容边界['0', '76', '1080', '724']。测试点[['0', '0'], ['540', '400'], ['0', '76'], ['1080', '724'], ['360', '292']],对应源坐标[None, ['400', '240'], ['0', '0'], None, ['800/3', '160']];None表示落在内容矩形外。

第3组源640×600、窗口720×1080,缩放9/8,内容边界['0', '405/2', '720', '1755/2']。测试点[['0', '0'], ['360', '540'], ['0', '405/2'], ['720', '1755/2'], ['240', '855/2']],对应源坐标[None, ['320', '300'], ['0', '0'], None, ['640/3', '200']];None表示落在内容矩形外。

第4组源1280×480、窗口900×800,缩放45/64,内容边界['0', '925/4', '900', '2275/4']。测试点[['0', '0'], ['450', '400'], ['0', '925/4'], ['900', '2275/4'], ['300', '1375/4']],对应源坐标[None, ['640', '240'], ['0', '0'], None, ['1280/3', '160']];None表示落在内容矩形外。

第5组源800×600、窗口1440×800,缩放4/3,内容边界['560/3', '0', '3760/3', '800']。测试点[['0', '0'], ['720', '400'], ['560/3', '0'], ['3760/3', '800'], ['4880/9', '800/3']],对应源坐标[None, ['400', '300'], ['0', '0'], None, ['800/3', '200']];None表示落在内容矩形外。

第6组源960×480、窗口1440×1080,缩放3/2,内容边界['0', '180', '1440', '900']。测试点[['0', '0'], ['720', '540'], ['0', '180'], ['1440', '900'], ['480', '420']],对应源坐标[None, ['480', '240'], ['0', '0'], None, ['320', '160']];None表示落在内容矩形外。

中心、左上边界、右下边界及内部点一起检查,右下边界不属于可点击内容。

独立核对与边界

缩放后宽高都不能超过窗口,至少一轴应恰好填满。左右边距相等、上下边距相等;将有效源坐标重新缩放并加边距,应还原原窗口点。刚好落在右边或下边界的点要判为外部。

此例不裁剪、不拉伸,也不添加设备像素比。真实系统若在最后一步取整,边缘像素可能需要更细规则。先明确坐标是逻辑单位还是物理像素,再套用对应尺寸,不能把两套单位混算。

练习时只改变一个条件,先判断哪些中间步骤应当受影响,再重新计算。要把空状态、数值零和未能确定的结果分开。边界约定不同可能产生不同答案,复查的目标是确认输入、过程与规则一致,而不是只追求最后一个数字看起来相同。