帧工坊 FrameCraft 帧工坊 FrameCraft

九宫格(9-slice)切图怎么做:Unity / Godot / Android .9.png

一个圆角面板直接拉伸,四角会被拉成椭圆、边框粗细也会变——所以有了九宫格:把图切成 3×3,四角完全不缩放、四条边只在一个方向拉伸、中间随便拉。一张小图就能适配所有尺寸,不用为每个尺寸单独出一张。这篇讲清楚:哪些图能切、四边内边距怎么量、各引擎怎么设、以及几个一踩就废的坑。

帧工坊教程 · 切图规范 · 约 7 分钟

九宫格 3×3 分区示意 角横向拉伸角 纵向中心纵向 角横向拉伸角 源图 240×150,四边内边距各 60px 60变宽60 变高变大变高 60变宽60 拉到 270×150:四角仍是 60×50,一点没变形 四角保护住了圆角与边框,中间区域随便长
九宫格的本质:牺牲中间区域的"精确",换取四角的"绝对不变形"。所以中间必须是能被拉伸的内容。

一、3×3 分区在做什么

二、哪些能切,哪些绝对不能切

一句话判断

容器九切,图标缩放。有边框、中间是纯色或规则纹理的(面板、对话框、按钮、提示框、血条/进度条、输入框)→ 九切;有具体形象的(道具图标、logo、角色头像、插画)→ 只能等比缩放,九切会把它的中间拉变形,越看越不对。

拿不准时问自己一个问题:这张图的中间区域,被拉宽两倍之后还成立吗?纯色底板成立,一张脸不成立。

三、四边内边距怎么量

内边距(inset)就是四条分割线的位置,量错整个九切就废了。规则:

四、各引擎怎么设

Unity(uGUI)

  1. 贴图导入设置:Texture Type = Sprite (2D and UI),保持单张 Sprite。
  2. 打开 Sprite Editor,填四个边框值 L / R / T / B(像素),Apply。
  3. 给 Image 组件赋值,Image Type = Sliced;需要中空就关掉 Fill Center。
  4. 改大小时改 RectTransform 的 Width / Height,不要改 Transform 的 Scale——Scale 是整体缩放,会把你辛苦保护的圆角一起放大。

Godot

用 NinePatchRect 节点,贴图上设 Patch Margin(Left / Top / Right / Bottom)。按钮的常态、悬停、按下三态要用 Theme 里的 StyleBoxTexture 分别配,不要只改一张图的颜色。

Android(.9.png / Nine-patch)

在 PNG 四周各留 1px 画黑线:左边和上边的黑线标"可拉伸区",右边和下边的黑线标"内容区"(文字能放进去的范围)。必须是 .9.png 结尾,且黑线只能是纯黑(#00000000 之外的纯黑),差一个色值 Android 就不认。

CSS

用 border-image:border-image-source 指定图,border-image-slice 填内边距(可带 fill 保留中心),并配一个对应的 border-width。

五、几个一踩就废的坑

六、帧工坊里怎么走这一步

九切本身在引擎里完成,但素材准备可以在这里做:先把 AI 出的面板图去背、把边缘脏色修掉,再按需要的档位导出(九切源图不用大,够用即可),最后检查体积。

常见问题

九切之后还要导出 @2x/@3x 吗?

要,但只需一两档。九切解决的是"同一档下适配不同尺寸",解决不了"不同 DPI 屏的清晰度"。常见做法是出 @2x(主档)和 @3x(高清档),九切内边距按各自档位换算(2 倍图的边距也是 2 倍)。

为什么我设了九切,拉伸后圆角还是变形?

九成是用 Scale 缩放而不是改尺寸,或者内边距切进了圆角内部(角区没有完整包住圆角)。先检查这两项。

中心区域可以斜着铺图案吗?

斜纹、带方向的纹理拉伸后会露馅(纹理被拉长)。中心区最好是纯色、渐变或无方向性的规则纹理;实在要花纹,考虑让中心改成平铺(tile)而不是拉伸。

血条 / 进度条怎么做?

外壳(带边框的那层)做九切,填充层用单独一张可平铺或可裁剪的图,靠代码改填充比例。别把填充层也九切——它的长度是连续变化的。

下一篇一套 UI 图标要导出几个尺寸:@2x/@3x、安卓五档、iOS、ICO 上一篇AI 生成的 UI 素材怎么用起来:从一张 PNG 到能进引擎

相关工具