Skip to content

智能眼镜 · 调研、概念与实现 ​

状态:2026-11-03。第一段(2026-11-02)做了真机调研、数据核对、三个概念与像素静帧;用户选了推荐的“甲为底、乙作例外”,并要求配图、不要纯字。第二段已实现为 forms/glasses.html,实现与验证见 E 节。原型探索,不是规范:不改契约、演示数据与现有原型。页面只读同一份 scenario.mjs 回放,不新增数据字段;上屏的每个数都由页面按 B 节的规则现算。第一段的推算脚本与渲染页只留在本机,不入库。

用户的问题:像 Even G2、乐奇(Rokid)那样小的有效显示区,Fold 要怎么设计?过程中用户补了几句,本文照它们定下来:

  • “眼镜肯定就放不下 64 的注意力了”:眼镜上不画 64 份,没有份额刻度、份额条。状态仍是 64 份,契约不变;眼镜上显示哪几件,由现有字段按 C.1 的规则取,不另设预算。
  • “要搞成绿绿的那个样子”:显示面是单色绿的真机观感,黑即关(透明)。
  • “看看 even g2 的开发者文档”:显示面以 Even Hub 开发者文档为准,576 × 288,4 位 16 级灰阶,页面只能由文本、列表、图片容器拼成。
  • “可以配点图,灰度马赛克图也是有信息。不要纯字”:能看图的信息从文字里拿出来,画进图片容器(E.2)。

去掉份额以后,每个概念都要回答一个问题:我怎么知道“这件比那件更该打断我”? 本文用这条主轴比较三个概念(C.5)。

A. 真机约束 ​

A.1 Even G2:开发者实际能用的显示面 ​

以 Even Hub 开发者文档为准;同一项在别处有不同数字的,记在表后的“别的说法”里。

项开发者文档怎么说对设计的意思出处
画布576 × 288,每眼一份,全画布可绘,原点左上显示面一比一按 576 × 288 画FAQ、设计指南、design-guidelines skill
颜色单色绿,4 位灰阶共 16 级;素材按灰度给,由硬件着绿;白显示为亮绿,黑是关,也就是透明能用的只有亮度;“黑”不是颜色,是让现实透过来同上;glasses-ui skill
屏幕绿设计指南把 #3CFA44 留给 G2 显示面,手机 UI 不许用显示面与透视都用这个绿everything-evenhub 设计指南 SKILL.md
能否任意画像素不能。显示面是容器模型:文本、图片、列表设计必须能拆成容器(每一屏的拆法见 E.3)FAQ
容器上限每页至多 4 个图片容器、8 个其他(文本或列表)容器;只有 1 个收手势(isEventCapture)一屏至多 8 段可分别调亮度的文字、4 张图设计指南、even-g2-notes · display
底色与边框没有背景色、没有填充;结构只靠边框与内容。边框宽 0–5、圆角 0–10、内边距 0–32选中靠切换边框宽,不能用反色块同上
字体固件里只有一款 LVGL 字体,不等宽,不能选字体、不能调字号;不支持的字符静默丢掉;左上对齐,居中靠补空格层级只能靠位置、亮度与边框,不能靠字号同上;font-measurement skill
行高与容量行高固定 27 px;满屏文本容器约 400–500 字符一屏 10 行;字宽文档没写,按 24 px 的汉字估(每行约 22 个汉字)同上
文字亮度SDK 0.0.14 起文本容器有 textColor,0–4 五档,“名叫颜色,其实是亮度”文字只有 4 个可见档;它们和 16 级灰阶怎样对应,文档没写(按 1→5、2→8、3→11、4→15 估)FAQ
图片宽 20–288、高 20–144,4 位灰阶;不能并发发送;整屏刷新约 800 ms,每次更新约 104 ms 固定开销只有图片能在一张里用几种亮度;图片不适合做动画FAQ、even-g2-notes · display
推送插件不能推送,只在前台运行;手机收到的通知由手机 App 自己决定是否显示打断只能走手机通知、由 Even App 镜像,卡片样式归系统;插件自己亮,前提是 Fold 正开在前台FAQ
输入镜腿或 R1 戒指共用一套:单击、双击、上滑、下滑(到边界才发 SCROLL_TOP / SCROLL_BOTTOM)、长按(按下与松开各一个事件);没有震动每个页面的操作要落在这五个手势上FAQ、even-g2-notes · display
传感IMU 数据可按频率上报;有佩戴检测抬头 / 低头可由插件自己判断FAQ
测试指南要求在真机或开着光晕的模拟器上看,绿光和显示器上不一样透视画了光晕设计指南 SKILL.md

别的说法:Even 的支持页与多数评测写 G2 是 640 × 350、视场 27.5°、1200 nit、刷新 60 Hz(官方页、notebookcheck);刷固件的非官方项目写 640 × 480(mixed-news 也记了这处出入)。本文按应用实际能寻址的 576 × 288 设计。

文档没有说清、要真机定的:

  • 固件字体覆盖哪些汉字与全角标点:even-g2-notes 只举了“日火水木金土”能显示。原型照中文画,这个前提未经真机核实,见 E.7。
  • textColor 各档的实际灰度。
  • 从镜像的通知能不能直接跳进插件。

A.2 别的眼镜,以及它们怎样打断人 ​

设备显示视场与位置输入打断与常见界面出处
Even G1640 × 200 单色绿 micro-LED,双目,1000 nit,20 Hz;SDK 文字宽 488 px、一屏 5 行,图 576 × 136 单色25°,视野上半的一条,约 2 m 处镜腿触控:单击翻页、双击关、三击静音;抬头唤出仪表盘通知、仪表盘、提词器、导航、翻译;评测抱怨一屏 4 行太少PCMag、EvenDemoApp、官方页
Even G2见 A.127.5°;高低、远近(近 / 中 / 远)App 里可调,官方图在视线略上镜腿、R1 戒指;双击唤醒、长按菜单;抬头仪表盘可关(评测者因误触关掉)官方原话:即时通知“离你更近、优先显示”,进行中的内容“在后面安静等着”;通知浮在视野上沿官方页、9to5Google 评测、Wareable 评测
Rokid Glasses(乐奇)每眼 480 × 398 单色绿 micro-LED,1500 nit,49 g23°(零售页写 30°),实拍在镜片中下右腿触控板与按键;“Hi Rokid” 语音通知是两道横线夹两行;“不是设计来一直亮着的”notebookcheck、官方页、EFTM 评测
Meta Ray-Ban Display600 × 600 全彩,仅右眼,最高 5000 nit,42 ppd20°,视线“稍偏右下”Neural Band 腕带肌电:捏选、中指捏返回、拇指滑;双击开关屏大多数时候熄屏;“为短交互设计”;通知是右下一张卡,字幕是对方脸下两行Meta 发布、UploadVR
Android XR 显示眼镜加色显示,黑即透明系统栏在下沿常显触控板与显示键指南:“只在需要时出现、然后退下”,“避免突然的、分心的视觉通知”;通知先是一枚只写人名的胶囊,看向它才展开设计原则、9to5Google

几家的共同点:

  • 显示区约 20–28°,只占视野中间一小块。
  • 单色绿的几家都把“不亮”当默认。
  • 打断都很省:一张卡或一枚胶囊,几秒后退下。

B. 数据核对(只读) ​

数据集 composite(Jonas 的两周,f00–f28 共 28 轮整理),默认帧 f26(8/16 00:00)。规则全部沿用已有原型,不新设:

  • 要紧:期限(ask.due_at,没有就用 item.due_at,已完成的不算)在 24 小时内(含已过),或档位是 critical / high。同腕上一瞥(watch.mjs)。
  • 排序:档位、24 小时内优先、期限、份额。份额只在前三项都相同时用来决胜负,不上屏。
  • 题目:问题的 short,没有就按腕上一瞥的 shortAsk 截到 16 个字以内。
  • 谁在等:等待链的规则,即这件事这一版所引依据的作者,去掉自己、机器人与自动化、公开来源、陌生人与生活 / 社区 / 订阅流;名字经 familyPlace 换成“母亲”“诊所”“水管工”,等了多久从他在依据里最早那条算起。
  • 只认当前版本的问题:currentAsk(s, id);作答记录键为 item.id|updated_at(respond.mjs)。问题随改写重登记时,上一版的作答仍算答过(同回应托盘)。

f26 开着 5 个问题,只有 1 件要紧:

问题回应路径档位 / 期限谁在等
ask-23 主水管:挖开换还是免挖?choose:整根挖开换(约 6.8 万克朗)/ 免挖穿新管(约 4.1 万)critical,8/17 10:00 前Ronny(水管工)、Kajsa;到 f27 加上母亲、邻居 Gunnel、Joakim Ek
ask-24 #13596 计时修复:批准?approve—hardy_birch、quiet_sedge
ask-22 三个旧 PR 推到哪天?defer——(f23 时有 noble_isle)
ask-21 Signe 的同意书签了吗?confirm8/18 23:59 前—
ask-19 VAB 报了吗?confirm—Kajsa

两周里与眼镜相关的数:

  • “最前那件”换了几次:4 次,f01 ask-05、f03 ask-08、f22 ask-16、f26 ask-23。f23–f25 没有要紧的事。对照:腕上一瞥“新变要紧”的有 7 件,分在 6 轮(f01、f02、f03、f08、f18、f26)。
  • 通话:家庭流里通话、未接与留言共 10 次。
    • 2 次在 f00,那时还没有任何问题。
    • 3 次对得上“对方在等的问题”,全是母亲、全是 ask-08“母亲九月住哪?”:8/9 21:10 你打给母亲 24 分钟(f13)、8/12 10:20 母亲留言 19 秒(f18)、8/13 19:30 你打给母亲 12 分钟(f21)。家庭流里的通话记录都是你打出去的。
    • 另 5 次对不上:诊所 4 次(8/11、8/12 未接与留言、8/14 08:02),水管工 1 次(8/15)。
    • 规则的盲点:8/14 08:02 打给诊所,正是 ask-16“打诊所?”要你做的事,但诊所不是这件事任何依据的作者,所以对不上。照实留着。
  • 把“通话”放宽到消息:202 条来信里有 107 条能对上某件事的等待者,大半是因为 Kajsa 站在多数问题后面。所以只认通话、未接与留言。
  • 亮度档(丙的规则:要紧 15、三天内到期 11、其余 8):两周换档 6 次,每 10 分钟查一次。
    • 6 次都与整理落地同刻,相差不到 1 分钟。三次是档位变化(ask-01 两次、ask-07),三次是期限越过 72 / 24 小时(ask-02 两次、ask-21),而这几个期限恰好落在午夜前后。
    • 在这份数据里,时间推进本身没有让任何一件在两轮之间变亮。
  • 同时开着几件:最多 8 件(f04、f08、f15);f28 是 7 件。
  • 真实的一天(8/16):
    • 00:00 f26 落地;
    • 09:48 Gunnel“明天定”;
    • 10:30 Kajsa 说预算;
    • 12:00 f27;
    • 18:05 Ronny“明早 10 点前”;
    • 22:40 Kajsa“Har du svarat rörkillen?”(你回水管工了吗?);
    • 8/17 00:00 f28。
  • 真实结局:母亲那件,8/14 12:00(f23)那一轮写着母亲自己选了疏散公寓,Jonas 没在任何界面上答过。

story(手写情境,36 轮)的问题没有 short。它没有通话记录,所以乙在 story 上不亮。“最前那件”换得勤,36 轮里 18 次,页面照实画;讲一遍停在 f22。

C. 共同的取舍 ​

C.1 不画 64 份:理由与取子集的规则 ​

腕上一瞥能画份额环,是因为 1.5 英寸的表盘看的是“今天的注意力怎样分”。眼镜不画,理由有四:

  1. 放不下:576 px 宽要放 64 格,每格 9 px,在 25° 视场里不到半度,小于一个字。
  2. 回答的不是同一个问题:份额回答“这两周我的注意力怎样分”,那是坐下来看的;眼镜上的问题是“现在要不要打断我、为了哪一件”。
  3. 常亮的代价:份额环要一直亮着才有意义,而几家眼镜都把“不亮”当默认(A.2);常亮的像素就是挂在视野里的东西。
  4. 份额本来就只决胜负:排序里份额排在档位、24 小时、期限之后,去掉它不改变任何一件的去留。

就像晨间朗读舍弃了空间总览,眼镜舍弃份额。份额仍在状态里,契约不变,回到手机或桌面就能看。

眼镜上显示哪几件,只从现有字段按写明的规则取:

  • 甲:要紧的里排第一、还没答过的那 1 件。
  • 乙:通话对象出现在“谁在等”里的问题(取排序最前的一件);通话期间别的要紧事先按住,挂断后出一次(最多两件,其余写“另 N 件”)。
  • 丙(没做):全部开着的问题,最多 8 件,按亮度档排序。

C.2 亮度词汇:16 级里只用 4 档 ​

灰阶(0–15)textColor只用来表示文字里的例子图里的例子
154等你回应题目、选中的选项与它的框截止前的那一格、过了期限的格、选中选项的比例条
113你刚做的事“已存 · 免挖穿新管”勾、等下一轮整理的进度、通话对象的首字
82次要信息期限、还有几小时、没选中的项、选项预览已过去的小时、其余等你的人、已通话的分钟
51环境时间、操作提示、“另 N 件”、已收到还剩的格(矮格)、没选中的比例条、已收到的勾
00关,也就是透明其余全部其余全部

腕上一瞥与 D 里“朱红只给等你回应”这层单一含义,在眼镜上由最亮的 15 承担:15 档不给时间、不给装饰,也不给已经答过的事。图片容器能用 16 级,但也只用这 4 档,好让图和字的亮度对得上。检查脚本逐页核对这两条(E.6)。

C.3 对照设计指南,逐条 ​

指南条目原型怎样做合不合
576 × 288,原点左上一比一渲染,页面上整体放大,像素网格不变合
4 位灰阶、硬件着绿、黑即关每个像素量化到 16 级,着 #3CFA44,没画的地方是黑合
无背景、无填充只有文字、边框与图片;选中用边框,不用反色块合
每页 ≤ 4 图 + ≤ 8 其他,只有 1 个收手势最满的两页:抬头那一件 8 个文本 + 2 张图,通话 8 个文本 + 3 张图;每页一个隐藏的全屏文本容器收手势合(文本贴着上限)
图片 20–288 × 20–144刻度 288 × 24 / 20、首字块 32 高、比例条 226 × 20、分钟格 20 高、进度 288 × 20、勾 24 × 24合
一款字体、不能调字号全部一个字号(24 px 估),层级只靠位置、亮度与边框合
行高 27 px文字行按 12 + 27k 排合
左上对齐,居中靠空格右上角的时间是把容器放在右边,真机上要用字宽测量工具算宽度合,要测字宽
不支持的字符静默丢掉只用 > 与 Latin-1 的 ·;勾不用 ✓(Dingbats 整段没有),画成图;首字块在手机端画好再送,不靠固件字体合;汉字覆盖待真机核实
假按钮用 >,选中切边框,多行叠文本容器三个以上的选项、挂断后的两件都用 > 与边框合
进度条用 ━ ─刻度与进度没用字符,用图片:一行里要三四种亮度,而一个文本容器只有一种有意偏离,理由如左
图标 24 × 24、1 位、笔画 ≥ 2 px勾按 2 × 2 的块画;首字块也按 2 × 2 的块、单一灰度合
400–500 字一页,长文要分页每屏最多约 60 个汉字,远低于容量;留白是有意的,Even 自己的通知卡也只有 3 行合
图片约 800 ms 整屏刷新、不能并发图片逐张送达,每张 104 ms 加按面积分摊的时间,文本立刻换(E.4)合
眼镜绿不进手机 UI页面框架(帧导航、概念卡、镜腿、时间轴)全是灰阶,绿只出现在显示面与它叠在视野上的光合

指南没有给眼镜屏的边距与每屏信息量。原型左右各留一个字宽(24 px),上下留 12 px。

C.4 三个概念 ​

甲 · 一行(做了,作为底) ​

  • 载体 / 场景 / 用法:Even G2(或任一单色绿眼镜)配手机 / 走路、做饭、开会间隙 / 平时不亮;“最前那件”换了,手机发一条通知,由 Even App 镜像上来;Fold 在前台时,抬头看一眼当前那一件。
  • 读者此刻的问题:现在有没有一件非我开口不可的事?是哪一件?
  • 这件比那件更该打断我? 不用比。眼镜替你比完,只剩一件;出现本身就是“最该打断”,其余一律不出现。区分靠出现。
  • 通道:
    • 出现与否给“要不要打断”;
    • 15 档给“这是等你回应的”;
    • 小时刻度给“快到了还是还早”;
    • 首字块给“谁在等”;
    • “另 N 件不用现在”用 5 档,只交代没被丢掉。
  • 骨架:每一屏的容器拆法见 E.3。
  • 舍弃:
    • 64 份与份额排序(C.1);
    • 其余开着的问题只剩一个数;
    • 问题的来源与等待链只剩“谁在等”的首字;
    • reply、schedule、defer 不在眼镜上答(没有键盘,挑日子的列表太长),长按交给手机。
  • 和腕上一瞥及 D 的差异:腕上一瞥换轮三拍,新变要紧的每件都亮(两周 7 件、6 轮);甲只在“最前那件”换了的时候亮(4 次)。D 把所有问题排成卡片;甲只有一件。
  • 灵感:Even G2 官方说的“即时通知离你更近、优先;进行中的内容在后面安静等着”;Android XR 的“只在需要时出现、然后退下”。

一天里的时刻(8/16):

时刻发生什么眼镜
00:00 f26 落地最前那件从“无”变成主水管手机通知镜像一次:“主水管:挖开换还是免挖?明天 10:00 前 · Ronny、Kajsa 在等”
07:25 厨房抬头那一件、34 格的小时刻度(已过 8 格)、R K 两个首字块、“另 4 件不用现在”;低头即清空
12:00 f27 落地最前没换不亮
18:05、22:40Ronny、Kajsa 的消息不亮(消息不是整理);抬头看到刻度只剩 11 格,等的人变成 5 个
8/17 00:00 f28开着 7 件,最前仍是主水管不亮

从浮现到回执:

  1. 中性的手机通知卡(来自手机通知,纯文字)。
  2. 轻点打开 Fold 的那一件。从通知直接跳进插件能否做到,待真机核实。
  3. 轻点进入作答,滑动换选,轻点确定。
  4. 出现“已存 · 免挖穿新管”和等下一轮的进度;双击撤回。
  5. 下一轮落地后不发通知,抬头时降成 5 档的“已收到”。

换轮的克制:只有“最前那件”换了才通知。最前没换、要紧清零、回执变“已收到”都不通知,只在下次抬头时看到。

乙 · 对面的人(做了,作为甲唯一的例外) ​

  • 载体 / 场景 / 用法:同上 / 打电话、留言进来时 / 只在这时亮;只亮对方在等你的那件,答完就挂。
  • 读者此刻的问题:她在电话那头,我有没有欠她一个答复?
  • 这件比那件更该打断我? 处境压过排序:眼前这个人在等的,排在别的要紧事前面,哪怕那些已经过期。通话期间别的要紧事先按住,挂断后出一次。区分靠出现加处境。
  • 通道:
    • 通话本身给“现在”;
    • “谁在等”给“哪一件”;
    • 右上的分钟格给“通话进行到哪”;
    • 她等了多久的刻度给“她等了多久、还剩多久”;
    • 15 档只给她在等的题目。
  • 舍弃:
    • 64 份(C.1);
    • 通话以外的一切时刻,整理落地本身从不让它亮;
    • 对不上等待者的通话(诊所、水管工)。
  • 和腕上一瞥及 D 的差异:两者都按“多急”排序;乙不看多急,只看“谁在线上”。
  • 灵感:Meta Ray-Ban Display 的字幕放在对方脸下;Android XR 的通知只写人名;等待链(第四轮 05)“谁在等”。

一天里的时刻:

时刻发生什么眼镜
8/9 21:10(f13)你打给母亲,24 分钟亮 ask-08,那时还有 5 天
8/12 10:20(f18)母亲留言 19 秒亮 ask-08(母亲等了 8 天、还有 3 天),“另 2 件要紧”
8/13 19:30(f21)你打给母亲,12 分钟;开着 6 件、要紧 3 件亮 ask-08(母亲等了 10 天、还有 28 小时),右上 12 个分钟格随通话亮起
8/13 19:42挂断出一次按住的两件:Smilla 多吃了药:打诊所?已过 4 小时;派对回几个人?已过 20 小时
8/14 08:02(f22)你打给诊所,6 分钟不亮:诊所不在 ask-16 的等待者里(B 节说的盲点)

从浮现到回执:

  1. 接通(或留言进来),页面亮。来源是手机的通话状态,原型取自通话记录。
  2. 轻点进入作答,滑动换选,轻点确定。
  3. 出现“已存”,仍在通话中。
  4. 挂断,按住的几件出一次。
  5. 下一轮读到。

换轮的克制:换轮从不让它亮。如果通话中恰好有一轮落地、题目换了版本,页面只把字原地换掉,不闪。

丙 · 渐亮(没做) ​

顶边一道杠一件,亮度分三档(要紧 15、三天内到期 11、其余 8),从不弹出,抬头才展开成行,自己比。第一段画过静帧,第二段不做,理由有三:

  1. 要 Fold 常驻前台、像素常亮:几家眼镜都把“不亮”当默认,插件也只在前台运行。
  2. 亮度是户外最弱的通道:在这份数据里它也不会“渐”亮,换档只发生在整理落地时(B 节,两周 6 次)。
  3. 结构不新:它是缩小了的 D(一排卡片按多急排),把卡片缩成了杠。

C.5 主轴对照与选定 ​

甲 · 一行乙 · 对面的人丙 · 渐亮
这件比那件更该打断我?出现:只剩一件出现 + 处境:线上的人在等的亮度 + 次序:你自己比
两周主动亮几次4 次(通知)3 次(通话与留言)0 次,但一直亮着
常亮像素005 道杠,时时都在
要不要 Fold 常驻前台不要(走通知)要,或者走通知要
盲点不看处境:电话里的人在等的那件不一定是最前的只覆盖 3 个真实时刻;诊所那样不是依据作者的人对不上只在落地时换档;户外亮度最难分;本质是缩小的 D

选定(2026-11-02,用户同意推荐):以甲为底,乙的通话规则作它唯一的例外。 平时只有“最前那件”换了才亮(两周 4 次);和等你的人通话时,改亮对方在等的那件(3 次),挂断后回到甲。理由:

  • 甲最符合几家眼镜共同的做法(默认不亮、一次一张卡),而且 4 次推送都是真实数据里的真变化。
  • 乙是三者里唯一眼镜才有的新东西:只有戴在脸上的屏能在你开口的那一刻给提示。但单做只有 3 个真实时刻,撑不起一个形式,作甲的例外正好。
  • 丙的理由见上。

D. 静帧 ​

第二段:带图的静帧 ​

第二段的静帧直接截自原型页:

  • ?still=display:576 × 288,一比一。
  • ?still=boxes:两倍大,虚线框出每个容器。
  • ?still=view:1200 × 720 的透视。

都配 ?at=<毫秒> 停在某一刻,配 ?press=head,click,down 依次按下。例:glasses.html?frame=26&at=1786857900000&press=head&still=display 是 8/16 07:25 抬头那一屏。

状态时刻与操作图片
抬头(静息后)8/16 07:25,f26,press=head小时刻度、首字块
浮现f26 落地无(中性的手机通知卡,纯文字)
打开f26,press=click小时刻度(刚开始)、首字块
作答中07:25,head,click,down两根比例条
回执07:25,head,click,down,click勾、等下一轮的进度
换轮再 next:f27,0 像素;再 head:“已收到”(勾降到 5)勾
乙 · 通话8/13 19:37,f21(通话第 7 分钟)分钟格、她等了多久的刻度、首字块
乙 · 作答 / 回执19:37,click,down / click,down,click无 / 勾、进度
乙 · 挂断19:42两件各自的刻度(过期的格 15)
乙 · 留言8/12 10:20,f18同通话,右上换成时间
乙 · 对不上8/14 08:02 打给诊所0 像素
夜里抬头8/16 22:40,f27刻度只剩 11 格、5 个首字块

第一段:三个概念的静帧 ​

第一段的静帧画在独立的渲染页上,包括三个概念、对照总表、真机视场对照与调研参考图。它们和第二段的静帧一样,只留在本机,不入库。

E. 第二段:实现 ​

E.1 页面 ​

页面是 forms/glasses.html、glasses.mjs、glasses.css,用 boot('glasses') 套 shell.mjs 的页框(帧导航、概念卡、核对数据、?frame=、?card=0),同腕上一瞥与回应托盘。从上到下:

  • 一句处境:例如“你在和母亲通话:亮母亲在等你的那一件”。

  • 显示面:576 × 288 的 canvas,image-rendering: pixelated。放大规则:

    • 整数倍(按设备像素)能占到可用宽度的 85% 以上时取整数倍,例如 1440 × 900、概念卡展开时 1 倍,两倍屏上 2 倍;
    • 否则按可用宽度放下,例如概念卡收起的 1440 × 900 上 1.30 倍,390 宽的 iPhone 上约 1.86 设备像素一格,820 宽的 iPad 上约 2.68;
    • 像素网格不变,不重新排字。

    下面写着这一页用了几个容器。

  • 透视:平面的第一人称视野,60° 镜头。

    • 场景按处境选:通话与挂断是走在路上,5–12 点是清晨厨房,其余是桌前。
    • 绿光按 G2 的 24.6° × 12.3° 放在视线略上,加色叠在视野上,再加一层光晕。
    • 不画镜框、不画高光。
  • 镜腿 / R1 戒指:五个手势各一个按钮,另有抬头 / 低头与上一个 / 下一个时刻。

  • 两周时间轴:

    • 一轮一道刻,甲亮过的四轮是高的绿刻;
    • 一次通话一个点,对上的三次是绿点,对不上的是空心圈;
    • 点一格跳到那一刻,图例的数由回放现算。
  • 键位说明与“↺ 重演”。

窄屏(≤ 1024 px,iPad 与手机)收起概念卡与顶栏的帧刻度,排成一列,顺序是显示面、镜腿、透视、时间轴。≤ 640 px 时顶栏只留 ‹ 帧 ›。手机与 iPad 上,显示面本身就能点、双击、滑、长按。

E.2 图片容器:画什么、从哪来 ​

每张图都按 1:1 像素生成 4 位灰度,只用 0 / 5 / 8 / 11 / 15,与文字一起量化到 16 级再着绿。每页不超过 4 张。

图画法来源字段用在
小时刻度(288 × 24,挂断后 288 × 20)一格一个单位,取 1 / 2 / 3 / 6 / 12 小时、1 / 2 / 7 天里最小的、能让格数 ≤ 36 的那个。已过的格 8;还剩的格是 5 的矮格;截止前那一格 15 全高;过了期限的格 15。没有期限时只画已过的格。一眼读出:亮格占多少是“快到了还是还早”,截止之后还有亮格就是“已过多少”ask.due_at(没有就 item.due_at)。起点:甲与挂断用问题第一次登记的那一轮的 frame.at;乙用等你的人在依据里最早那条输入的 at。终点:此刻抬头那一件、通话、挂断
谁在等(每人 32 × 32,至多 6 人)首字母或首字画成 16 × 16、按 2 × 2 的块放大,单一灰度。其余的人 8,正在线上的那个人 11。没有头像、没有照片这一版 item.sources 的作者,按等待链的规则(B 节)抬头那一件、通话
比例条(每个选项 226 × 20)一格一个单位(1 万),选中的 15、另一个 5;只在每个选项都有数、单位相同时画ask.prompt 里选项标签后括号中的数,例如“整根挖开换(约 6.8 万克朗)”两个选项的作答页
通话分钟(一格 1 分钟,超过 28 分钟一格 2 分钟,20 高)已通话的分钟 8,还没到的 5 的矮格通话记录 call_log 的“· N min”与它的 at;已通话 = 此刻 − at通话
等下一轮整理(288 × 20)一格一个单位,取 10 / 15 / 30 分钟、1 / 2 / 3 / 6 小时里最小的、能让格数 ≤ 24 的那个。已过 11,还剩是 5 的矮格,最后一格是落地(11 全高)回应记录的 at(respond.mjs,只在本页内存),以及 frames 里它之后的第一轮回执
勾(24 × 24)1 位,2 × 2 的块;已存 11,已收到 5回应记录与 responseStatus回执、已收到

浮现时的卡是中性的手机通知样式,标明“手机通知 · Fold”,只有文字,不仿 Even 的品牌样式。它不是 Fold 的容器:插件不能推送,镜像的通知归系统画。

E.3 每一屏的容器 ​

屏文本(≤ 8)图片(≤ 4)
0 像素1(隐藏的全屏文本容器,收手势)0
手机通知系统画,不占 Fold 的容器0
抬头那一件8:收手势、时间、“HH:MM 整理 · 最前换成这一件”(落地后 12 小时内)、题目(15)、还有几小时、期限、“在等你”、“另 N 件不用现在”2:小时刻度、首字块
作答(两个有金额的选项)5:收手势、题目、两个带框的选项、提示2:两根比例条
作答(其余)收手势、题目、至多 4 个选项(> 与边框)、提示0
回执≤ 7:收手势、(通话中)对方、题目(8)、“已存 · …”、下一轮的时间、还要多久、提示2:勾、等下一轮
通话8:收手势、“母亲 · 通话中”、题目、“母亲等了 10 天”、还有几小时、选项预览、“在等你”、“另 2 件要紧 · 挂断后再说”3:分钟格、她等了多久、首字块
留言、未接8:同通话,没有分钟,时间并进第一行(“母亲 · 留言 19 秒 · 10:20”),单独放会是第 9 个文本容器2:她等了多久、首字块
挂断7:收手势、“挂断了 · 刚才按住 2 件”、时间、两件的题目(选中的那件带边框)、两件的已过几小时2:两件各自的刻度

E.4 图片按真机的代价送达 ​

换页时文本立刻换。图片排队一张一张送,不并发,每张用时 104 ms 加按面积分摊的时间。整屏 4 张 288 × 144 合计约 800 ms,一张 288 × 24 的刻度约 120 ms。

  • 同一个框里旧图留到新图到达;新出现的框在送达前是空的。
  • 不做补间:图只在送达那一刻整张换掉。
  • 截静帧时(?still=)、讲一遍跳到终态时、减弱动态时,图片直接到位。

E.5 操作、时间与讲一遍 ​

  • 镜腿五个手势:轻点 Enter、双击 Backspace(Esc 同)、上滑 ↑、下滑 ↓、长按 L(按住 0.45 秒)。显示面上:轻点、0.28 秒内两下是双击、竖向拖过 28 px 是滑、按住 0.45 秒是长按。

  • H 抬头 / 低头:抬头出那一件,低头 0 像素。真机上由插件读 IMU,前提是 Fold 在前台。

  • 时间:

    • ←/→ 换整理时刻,落在“最前那件换了”的一轮时出手机通知卡;
    • [ / ] 在值得看的时刻之间跳,即推送、对上的通话与挂断,都由回放推出;
    • ?at=<毫秒> 停在两轮之间的某一刻;
    • 时间轴点一格跳到那一刻。
  • 作答:

    • 只在眼镜上答 confirm、approve 与 ≤ 4 项的 choose(含义是 decide 或 act 的选项)。
    • reply、schedule、defer 长按交给手机(本页只出一句提示)。
    • 记录走 createResponseStore:save(item, action, { ask, at: 此刻 }),via 是默认的 button。先“已存”,下一轮整理后“已收到”,双击撤回。不写回演示数据。
  • 讲一遍:直接打开(顶层、不带 frame=、不带 at=、没有来源页)时演一次,约 10.6 秒:

    • 0 秒:停在目标轮的前一轮,0 像素;
    • 0.9 秒:目标轮落地,出手机通知卡;
    • 3.3 秒:轻点打开那一件,图片逐张亮起;
    • 5.6 秒:进入作答;
    • 6.8 秒:下滑;
    • 7.9 秒:确定,出回执;
    • 9.7 秒:双击撤回。

    目标轮是不晚于 f26 的最后一个推送轮(composite f26,story f22)。任意键或点按跳到终态:目标轮、打开那一件、没有记录、图片已到位。嵌入、合页与带帧的链接不讲,减弱动态时也不讲。

E.6 验证 ​

node scripts/check-ix.mjs --only glasses 用真的键盘、鼠标与触屏事件走一遍。composite 17 项、story 13 项,全部通过:

  • 两周的数与时间轴、图例一致:composite 甲 4 次(f01、f03、f22、f26),乙对上 3 次,通话 10 次;story 甲 18 次、没有通话。
  • 带 ?frame= 进来不讲,落在推送轮是中性的手机通知卡。
  • 轻点打开那一件,“另 N 件不用现在”与“还有 N 小时”与回放一致。
  • 换页时文本立刻换,图片逐张送达,每张至少 104 ms。
  • 作答存一条记录(via 为 button,at 为此刻),双击撤回清掉。
  • H 低头 0 像素;点时间轴上亮过的一格,跳到那一轮出通知。
  • ] 跳到 8/13 19:30 的通话,亮母亲在等的那件、按住 2 件;再 ] 是挂断,出这两件;打给诊所那一刻 0 像素。
  • 答过之后换轮不亮,抬头时是“已收到”。
  • 每一页都落进容器模型。逐页核对的有手动走到的七屏,以及两周里每一个值得看的时刻(composite 8 个:4 次推送各自打开、3 次对上的通话与留言、1 次挂断;story 18 个):
    • 文本 ≤ 8、图片 ≤ 4,图片尺寸合规,恰好 1 个收手势,都在 576 × 288 里;
    • textColor 0–4,图片只用 0 / 5 / 8 / 11 / 15;
    • 15 档只给题目与选项。
  • 手机尺寸上显示面轻点打开、双击收起,宽度不出屏。
  • 直接打开讲一遍,按键跳到终态;减弱动态不讲。

变异测试:每次只改坏一处,检查都抓到,改回后恢复通过。

改坏的地方抓到它的检查
“另 N 件”把这一件也算进去“另 5 件不用现在”与回放不一致
时间改用 15 档15 档给了“00:00”“19:42”
截止那一格画成灰度 12图片用了四档以外的灰度(刻度、挂断的两条)
留言那一屏把时间单独放回右上8/12 10:20 那一刻文本 9 个,超过上限

最后一条是真犯过的错:起初只核对手动走到的几屏,留言那一屏有 9 个文本容器没被发现,加上逐时刻核对后才抓到,改成把时间并进第一行。

另外跑过:node scripts/shoot-forms.mjs --only glasses 无报错;make check、make test、npm run site:build 通过。

E.7 还没做、没核实的 ​

  • 中文能不能上屏:G2 固件字体覆盖哪些汉字与全角标点,文档没写,不支持的字会静默丢掉。原型照中文画,这个前提未经真机核实。图片里的首字块不受影响,因为是在手机端画好再送的。
  • 从镜像的手机通知能不能直接跳进插件:没核实,原型假定能。
  • 手机端能不能拿到“正在和谁通话”:没核实,原型取自家庭流的通话记录。
  • 字宽与灰度是估的:字宽按 24 px 的系统字体估,textColor 各档的实际灰度按线性估,都要真机校。图片在第一次送达前是什么样子,文档也没写,原型画成空。
  • 通知不会自己退下:真机上镜像的通知几秒后退下,原型里它停到你轻点或双击为止。
  • reply、schedule、defer 只提示交给手机:页面不链到 D。
  • 作答不写回状态:“已收到”只表示推进到了下一轮整理,与 D 相同。

待拍板 ​

  1. 原型照中文画,是否接受“固件字体覆盖中文”这个未经真机核实的前提?若不接受,题目要换成固件确认能显示的字,或者整行画成图片(每页至多 4 张,会挤掉刻度与首字块)。
  2. 乙要的“正在和谁通话”在真机上从哪来,取决于手机端能拿到什么。要不要在页面上把乙标成“需要手机端的通话状态”?