切换外观
智能眼镜 · 调研、概念与实现
状态: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 G1 | 640 × 200 单色绿 micro-LED,双目,1000 nit,20 Hz;SDK 文字宽 488 px、一屏 5 行,图 576 × 136 单色 | 25°,视野上半的一条,约 2 m 处 | 镜腿触控:单击翻页、双击关、三击静音;抬头唤出仪表盘 | 通知、仪表盘、提词器、导航、翻译;评测抱怨一屏 4 行太少 | PCMag、EvenDemoApp、官方页 |
| Even G2 | 见 A.1 | 27.5°;高低、远近(近 / 中 / 远)App 里可调,官方图在视线略上 | 镜腿、R1 戒指;双击唤醒、长按菜单;抬头仪表盘可关(评测者因误触关掉) | 官方原话:即时通知“离你更近、优先显示”,进行中的内容“在后面安静等着”;通知浮在视野上沿 | 官方页、9to5Google 评测、Wareable 评测 |
| Rokid Glasses(乐奇) | 每眼 480 × 398 单色绿 micro-LED,1500 nit,49 g | 23°(零售页写 30°),实拍在镜片中下 | 右腿触控板与按键;“Hi Rokid” 语音 | 通知是两道横线夹两行;“不是设计来一直亮着的” | notebookcheck、官方页、EFTM 评测 |
| Meta Ray-Ban Display | 600 × 600 全彩,仅右眼,最高 5000 nit,42 ppd | 20°,视线“稍偏右下” | 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 的同意书签了吗? | confirm | 8/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 英寸的表盘看的是“今天的注意力怎样分”。眼镜不画,理由有四:
- 放不下:576 px 宽要放 64 格,每格 9 px,在 25° 视场里不到半度,小于一个字。
- 回答的不是同一个问题:份额回答“这两周我的注意力怎样分”,那是坐下来看的;眼镜上的问题是“现在要不要打断我、为了哪一件”。
- 常亮的代价:份额环要一直亮着才有意义,而几家眼镜都把“不亮”当默认(A.2);常亮的像素就是挂在视野里的东西。
- 份额本来就只决胜负:排序里份额排在档位、24 小时、期限之后,去掉它不改变任何一件的去留。
就像晨间朗读舍弃了空间总览,眼镜舍弃份额。份额仍在状态里,契约不变,回到手机或桌面就能看。
眼镜上显示哪几件,只从现有字段按写明的规则取:
- 甲:要紧的里排第一、还没答过的那 1 件。
- 乙:通话对象出现在“谁在等”里的问题(取排序最前的一件);通话期间别的要紧事先按住,挂断后出一次(最多两件,其余写“另 N 件”)。
- 丙(没做):全部开着的问题,最多 8 件,按亮度档排序。
C.2 亮度词汇:16 级里只用 4 档
| 灰阶(0–15) | textColor | 只用来表示 | 文字里的例子 | 图里的例子 |
|---|---|---|---|---|
| 15 | 4 | 等你回应 | 题目、选中的选项与它的框 | 截止前的那一格、过了期限的格、选中选项的比例条 |
| 11 | 3 | 你刚做的事 | “已存 · 免挖穿新管” | 勾、等下一轮整理的进度、通话对象的首字 |
| 8 | 2 | 次要信息 | 期限、还有几小时、没选中的项、选项预览 | 已过去的小时、其余等你的人、已通话的分钟 |
| 5 | 1 | 环境 | 时间、操作提示、“另 N 件”、已收到 | 还剩的格(矮格)、没选中的比例条、已收到的勾 |
| 0 | 0 | 关,也就是透明 | 其余全部 | 其余全部 |
腕上一瞥与 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:40 | Ronny、Kajsa 的消息 | 不亮(消息不是整理);抬头看到刻度只剩 11 格,等的人变成 5 个 |
| 8/17 00:00 f28 | 开着 7 件,最前仍是主水管 | 不亮 |
从浮现到回执:
- 中性的手机通知卡(来自手机通知,纯文字)。
- 轻点打开 Fold 的那一件。从通知直接跳进插件能否做到,待真机核实。
- 轻点进入作答,滑动换选,轻点确定。
- 出现“已存 · 免挖穿新管”和等下一轮的进度;双击撤回。
- 下一轮落地后不发通知,抬头时降成 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 节说的盲点) |
从浮现到回执:
- 接通(或留言进来),页面亮。来源是手机的通话状态,原型取自通话记录。
- 轻点进入作答,滑动换选,轻点确定。
- 出现“已存”,仍在通话中。
- 挂断,按住的几件出一次。
- 下一轮读到。
换轮的克制:换轮从不让它亮。如果通话中恰好有一轮落地、题目换了版本,页面只把字原地换掉,不闪。
丙 · 渐亮(没做)
顶边一道杠一件,亮度分三档(要紧 15、三天内到期 11、其余 8),从不弹出,抬头才展开成行,自己比。第一段画过静帧,第二段不做,理由有三:
- 要 Fold 常驻前台、像素常亮:几家眼镜都把“不亮”当默认,插件也只在前台运行。
- 亮度是户外最弱的通道:在这份数据里它也不会“渐”亮,换档只发生在整理落地时(B 节,两周 6 次)。
- 结构不新:它是缩小了的 D(一排卡片按多急排),把卡片缩成了杠。
C.5 主轴对照与选定
| 甲 · 一行 | 乙 · 对面的人 | 丙 · 渐亮 | |
|---|---|---|---|
| 这件比那件更该打断我? | 出现:只剩一件 | 出现 + 处境:线上的人在等的 | 亮度 + 次序:你自己比 |
| 两周主动亮几次 | 4 次(通知) | 3 次(通话与留言) | 0 次,但一直亮着 |
| 常亮像素 | 0 | 0 | 5 道杠,时时都在 |
| 要不要 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 里;
textColor0–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 相同。
待拍板
- 原型照中文画,是否接受“固件字体覆盖中文”这个未经真机核实的前提?若不接受,题目要换成固件确认能显示的字,或者整行画成图片(每页至多 4 张,会挤掉刻度与首字块)。
- 乙要的“正在和谁通话”在真机上从哪来,取决于手机端能拿到什么。要不要在页面上把乙标成“需要手机端的通话状态”?