按钮和提示框放大时,整体缩放会让边框与圆角一起变粗。九宫格方法把四角、四边和中心分开,让固定边框与可伸缩内部遵循不同规则。
先固定规则和输入
源图按左、右、上、下固定边宽切成九块。目标尺寸不足以容纳两侧边框时,本例主动把尺寸抬到边框总和;四角大小保持,横边只横向拉伸,竖边只竖向拉伸,中心双向拉伸。
源尺寸[167, 115],边框[左,右,上,下][8, 20, 15, 15] 源横边界[0, 8, 147, 167],源纵边界[0, 15, 100, 115]
把结果按步骤记下来
请求[24, 27],实际尺寸[28, 30],横边界[0, 8, 8, 28],纵边界[0, 15, 15, 30];按先行后列的九块宽高[[8, 15], [0, 15], [20, 15], [8, 0], [0, 0], [20, 0], [8, 15], [0, 15], [20, 15]],总面积840。
请求[28, 30],实际尺寸[28, 30],横边界[0, 8, 8, 28],纵边界[0, 15, 15, 30];按先行后列的九块宽高[[8, 15], [0, 15], [20, 15], [8, 0], [0, 0], [20, 0], [8, 15], [0, 15], [20, 15]],总面积840。
请求[77, 84],实际尺寸[77, 84],横边界[0, 8, 57, 77],纵边界[0, 15, 69, 84];按先行后列的九块宽高[[8, 15], [49, 15], [20, 15], [8, 54], [49, 54], [20, 54], [8, 15], [49, 15], [20, 15]],总面积6468。
请求[98, 112],实际尺寸[98, 112],横边界[0, 8, 78, 98],纵边界[0, 15, 97, 112];按先行后列的九块宽高[[8, 15], [70, 15], [20, 15], [8, 82], [70, 82], [20, 82], [8, 15], [70, 15], [20, 15]],总面积10976。
请求[251, 45],实际尺寸[251, 45],横边界[0, 8, 231, 251],纵边界[0, 15, 30, 45];按先行后列的九块宽高[[8, 15], [223, 15], [20, 15], [8, 15], [223, 15], [20, 15], [8, 15], [223, 15], [20, 15]],总面积11295。
请求[72, 115],实际尺寸[72, 115],横边界[0, 8, 52, 72],纵边界[0, 15, 100, 115];按先行后列的九块宽高[[8, 15], [44, 15], [20, 15], [8, 85], [44, 85], [20, 85], [8, 15], [44, 15], [20, 15]],总面积8280。
请求[93, 113],实际尺寸[93, 113],横边界[0, 8, 73, 93],纵边界[0, 15, 98, 113];按先行后列的九块宽高[[8, 15], [65, 15], [20, 15], [8, 83], [65, 83], [20, 83], [8, 15], [65, 15], [20, 15]],总面积10509。
前两组专门检查小于或恰好等于最小尺寸时的退化中心,其余组检查正常伸缩。目标范围中不应出现负宽度或负高度。
自己复核的办法
所有源分块应该刚好覆盖源图;所有目标分块应该刚好覆盖实际目标。中心宽或高为零时允许退化为空区域,不要除以零去计算缩放倍率。
建议先遮住结果,用本例原始输入独立完成一遍,再逐项对照。若出现差异,先找最早不一致的位置,检查索引从零还是从一开始、边界是否包含,以及比较或更新发生的先后。只比较最后一个数,往往无法分辨规则理解与计算步骤分别出了什么问题。
使用这个练习的边界
这种最小尺寸处理是本练习的明确选择,并非所有界面系统都如此。实际实现也可能压缩边框或裁切内容。比较截图前,应先确认采用了哪一种小尺寸规则以及像素对齐方式。
