F1.12.3safe area variation设计
安全区在不同设备形态下不同
别名: 安全区差异 · form-factor inset · 异形屏落位
概念解释
一颗悬浮主按钮写死「距底 16」。在带 Home 键的短屏上它清清爽爽;在全面屏上它坐进指示条;在折叠中间态它可能压在铰链缝里;在三键导航的 Android 上它又和回退键打架。安全区随形态变,意思是可点控件的合法落点不是一个跨设备的坐标,是每一种形态自己的一块活区域。把某一台样机上刚好安全的点抄到所有设备,会在另一台上把主操作送进不可点或误触的带。
这里管的是交互落点跟形态走,不是刘海怎么裁切画面、背景要不要铺到屏外——那是另一套排版规则。
机制
安全区是系统对「这一形态里哪些像素可以被当成稳定命中区」的声明,输入是圆角、挖孔、指示条、铰链、三键条,输出是一套随设备变化的 inset。应用若把按钮坐标写死在设计稿的画板上,等于忽略了这套输入。形态一换,同一物理位置对应的系统声明变了,按钮还停在旧坐标上,于是或被裁成点不到,或伸进手势带。
折叠、外接屏、桌面窗口化会在运行中途改形态。安全区不是启动时读一次的常数,是一次会在旋转、折叠、分屏时重发的事件。落点必须跟这次事件走,不能只在第一次布局时算。
边界
单一 SKU、形态永不改变的设备可以把安全区当常数。纯展示的背景、全出血的图片不受「可点落点」约束,可以铺到 inset 之外。鼠标指针的桌面窗口没有指示条和挖孔,安全区退化成窗口内边距,这条形态差异几乎消失。Web 在不能读到系统 inset 的旧浏览器里只能给保守的下限,宁可多空一截,也不要假设挖孔不存在。
怎么落地
- 主按钮、底栏、手势热区的位置跟系统 inset 走,不写死距底 / 距侧的像素。
- 在样机矩阵里至少覆盖:短屏实体键、全面屏指示条、三键导航、折叠展开、横屏。每一台看同一颗主操作是否仍在声明的安全区里。
- 监听旋转、折叠、分屏引起的 inset 变化,重新安放固定控件,而不是只在冷启动算一次。
- 验证:同一颗主按钮在矩阵里每台设备上截按下帧,看命中区是否落入指示条、铰链、挖孔或三键条。有一台落入,这个坐标就还是从那一台样机抄来的。