弹层位置需限定在当前屏内
别名: 弹层跨屏 · 菜单出屏 · bezel clipping · multi-monitor popover
概念解释
菜单、提示气泡、对话框、取色器、自动完成列表,都必须画在拥有它的那块屏里面。弹层按「整张虚拟桌面」去定位,就会骑在两块屏的边框上,或整块跑到邻屏——一边看不见,另一边以为没打开。
当前屏是指针所在、或锚点窗口所在的那一块,不是「坐标更大的那一块」。
机制
多块屏在坐标上相邻,在视觉上不相邻。中间是边框、缝、有时还有一块谁都没点亮的区域。Baudisch 等人把这条缝当成指点障碍来研究:光标能穿过去,视线不能把断开的两半当成同一个对象来读。菜单若一半在左屏、一半在右屏,文字在边框处被裁,命中区也断成两截。对话框若按屏幕中心的全局坐标去居中,可能出现在邻屏的中央,操作者盯着原窗口等待,以为指令被吞了。
弹层的寿命短、注意要求高,容错比主窗口更低。主窗口跨屏至少还占着标题栏可以再拖;气泡闪一下就没了,开错屏等于没开。定位应以锚点所在屏的可见矩形为笼子:先贴着锚点,放不下就改方向,再放不下就在本屏内滚动或压缩,绝不把溢出部分画到邻屏去「借空间」。
怎么研究
在双屏桌面上触发菜单、气泡和模态框,系统记录弹出矩形与各屏可见矩形的交集。经典做法是比较「按全局桌面坐标定位」和「按所属屏裁剪」:统计骑缝、整块跑到邻屏、以及操作者回头在原屏上寻找的次数。Baudisch 的 Mouse Ether、Drag-and-Pop 把边框当成不连续来处理,是同一条缝上的研究。
自变量:锚点距屏边的距离、两屏的相对位置(左右/上下)、定位策略。 因变量:弹层与所属屏的交集比例、骑缝次数、发现弹层的时间、误以为没打开的次数。
两屏按左右拼接去测,会漏掉「上屏 + 下屏」时垂直方向的骑缝;笔记本合上又打开外接屏时,「当前屏」可能瞬间变成一块已经不亮的屏。
边界
全屏独占(放映、游戏)里弹层本来就被锁在那一块画布上,问题转成「不要画到屏幕外」而不是「不要画到邻屏」。单屏无此问题。镜像模式两屏画面相同,弹层「跑到另一块」仍然看得见,但点的是哪一块仍可能乱。辅助功能的放大镜把局部像素再投到另一块屏上,弹层的「当前屏」要以用户正在看的那块为准,不能只认窗口坐标。
怎么落地
- 计算弹层位置时只用所属屏的可见矩形当边界:优先贴锚点,溢出则翻转、移位或在本屏内缩小,禁止跨过屏缝。
- 模态对话框在所属窗的那块屏上居中,不要按虚拟桌面的几何中心居中。
- 验证:把窗口拖到每块屏的四条边上,打开菜单、气泡、对话框、日期选择器。任何一块弹层出现骑缝、出现在邻屏、或打开后原屏毫无变化,都算失败。