鸿蒙端服务卡片四组问题,都属于「卡片上的交互/布局不能用」这一类。
现象:日程服务卡片右上角那个「今天」的「今」字按钮,点击区域特别小。 用户点它只想看今天有哪些日程,但一不小心就点进了某条日程的详情页。
诉求:把这个按钮的点击区域弄大一点。
注意:
验收:在真机上连续点「今」多次,都能稳定进入"今天日程清单"而不会误入详情。
现象:观影卡(2x4 规格)右侧的观影列表不能上下滑动,只显示两条半, 第三条被硬生生截断,很难看。
诉求(用户原话):「如果显示多个,就要能滑动,如果不能滑动,就显示两个。」
⇒ 两种合法解,任选其一,但不能"卡在中间":
验收:卡片上不能出现"被截断的半条"。
现象:任务卡(2x4 规格)的列表也是同样的情况 —— 不能滑动 + 被截断。
诉求:与观影卡 2x4 一致(能滑就滑,不能滑就显示整数个完整条目)。
现象 a:4x4 和 4x6 卡片的图片区是两列,但两列图片紧贴在一起,中间没有间隙。
诉求 a:缩小图片 / 加大列间距,让两列之间有可见空隙。 用户还提了:「这个大小,我感觉应该根据屏幕的大小来」—— 即不要写死像素尺寸,要按卡片可用宽度自适应。
现象 b(重点):4x6 的卡片,宽度和 4x4 是一样的(都是 4 列宽), 但里面却排成了三列图片,导致每张图更小、更挤。
诉求 b:4x6 的列数不应该因为"高了一档"就变成三列 —— 宽度没变,列数就该和 4x4 一样是两列,多出来的高度用来放更多行。
验收:
以上四组都在服务卡片上,验收必须真机看:
dumpLayout
四项改动都已完成,静态守卫与反向验证全绿,真机编译通过(HAP 产物已生成)。
病根:sideBtn() 里那个「今」只有 22×22(面积 484 vp²),比系统建议的最小点击区(约 40vp)小一半。手指稍微偏一点就落到卡片本体的 .onClick(openApp) 上 —— 于是「想回今天」变成「进了日程详情」,正是你描述的现象。
sideBtn()
22×22
.onClick(openApp)
改法:22×22 / radius 11 → 32×32 / radius 16,面积 484 → 1024(2.1 倍)。同一份 sideBtn() 里的「+」也一并放大,翻页键 ‹ › 本来就是 32,现在四个按钮手感一致。今 的字号 11 → 13,+ 与翻页键 14 → 15。
22×22 / radius 11
32×32 / radius 16
‹ ›
今
+
为什么是 32 不是 40:4×4 卡高度很紧,顶栏和内容区是竖向堆叠(内容区 layoutWeight(1)),顶栏长高多少内容区就少多少 —— 做成 40 会把时间轴挤掉一截。
layoutWeight(1)
关键点:必须改 width/height 本身。卡片里这是 Button,可点区就是自己的宽高;光改 padding / 字号 / hitTestBehavior 都不扩热区。
width
height
Button
padding
hitTestBehavior
两张日程卡(4×4 与 6×4)都改了。
病根不在「条数写错了」,而在容器用错了:右半原来是 Column({ space: 6 }) + justifyContent(Center),Column 根本不滚动,而 recent() 又硬截到 3 条 —— 3 × (38 色条 + 上下 padding 5+5 = 48) + 2 × 6 间隔 = 156vp,而 2×4 卡右半可用高度只有 ≈130vp ⇒ 第三条被父容器直接压扁/裁掉。
Column({ space: 6 })
justifyContent(Center)
Column
recent()
改法:换成 List(可滚动),条数上限从 3 提到 MR_2X4_MAX = 12。这样条目多于可见高度时能上下滑(你要的「显示多个就要能滑动」),可见高度天然只容得下完整的行(List 不会压扁行,行高由内容定)。
List
MR_2X4_MAX = 12
滚动条给的是 BarState.Auto —— 条目少的时候不露一条空滚动条。
BarState.Auto
同一个病、同一个改法:Column → List,rows() 的 slice(0, 3) → slice(0, TK_2X4_MAX),TK_2X4_MAX = 30。
rows()
slice(0, 3)
slice(0, TK_2X4_MAX)
TK_2X4_MAX = 30
数据侧(FbCardMediaData)两处的 rows.length < 4 也一并放到 30,否则卡上拿到的最多还是 4 条,改了容器也滑不出东西。
FbCardMediaData
rows.length < 4
列缝的病根:List({ space: 8 }) 的 space 在 lanes 多列模式下只管行间距,列与列之间不会自动留缝。而海报格是 .width('100%') + .aspectRatio(0.68),宽度由 lane 决定、lane 又贴着排 ⇒ 两列严丝合缝贴死,就是你看到的样子。
List({ space: 8 })
space
.width('100%')
.aspectRatio(0.68)
改法:.lanes(2) → .lanes(2, 8)(第二个位置参数才是列间距 gutter)。这里与行间距同取 8,横竖一致。
.lanes(2)
.lanes(2, 8)
gutter
⚠️ 中途我先写成了 .lanes(2, { gutter: 8 })(别的框架的习惯写法),查 SDK list.d.ts 才确认签名是 lanes(value: number | LengthConstrain, gutter?: Dimension),Dimension = PX|VP|FP|LPX|Percentage|Resource —— 对象形态编译不过。已改成位置参数。
.lanes(2, { gutter: 8 })
list.d.ts
lanes(value: number | LengthConstrain, gutter?: Dimension)
Dimension = PX|VP|FP|LPX|Percentage|Resource
三列改两列:6×4 的 .lanes(3) → .lanes(2, 8),与 4×4 一致。你问的「宽度都是一样的,为啥要弄成三列?」—— 确实是原来文件头里写着「这块卡更宽、一排放三张」,那句已经过时,也已在文件头注明别再照着它改回去。
.lanes(3)
关于「这个大小应该根据屏幕的大小来」:海报宽度现在是 lane 自动分配的(.width('100%') + gutter),也就是跟着卡片实际宽度走,不做写死的像素值 —— 这正对应你要的「按屏幕大小来」。但 lanes() 系列没有「最小宽度自动决定列数」的那种自适应形态(那是 LengthConstrain 或卡片 framework 的 breakpoint 才能做的),而卡片里只能用 List,所以列数还是固定的 2。真要按屏幕动态换列数,得等卡片框架支持,或者用 LengthConstrain 形态的 lanes 试 —— 我这次没动,因为那会让不同设备上列数不一致,反而更难预期。
lanes()
LengthConstrain
lanes
_fb_arkts_guard.js
groupV95()
‹
›
{ gutter: N }
_fb_v59d_falsify.py
{ gutter: 8 }
hvigorw assembleHap
entry-default-signed.hap
⚠️ 真机验收未做:hdc list targets 返回空 —— 设备当前没连上(可能没插线 / 没解锁 / 未开 USB 调试)。这四项改动全是观感与手感(按钮热区、能不能滑动、列缝宽度),静态断言只能证明「代码是这样写的」,证明不了「手指点得着、滑得动、看着舒服」。等你把设备连上并且屏幕解锁后,我再跑一遍真机探针(_fb_v7x_verify.py + uitest dumpLayout)确认,尤其是:
hdc list targets
_fb_v7x_verify.py
uitest dumpLayout
这三条是静态断言原理上抓不到的(本仓库踩过:v86 三个 bug 全绿但用不了)。
commit b84ea06 已推到 main。静态守卫 1255/0、反向验证 273/0 全绿。
b84ea06
main
四项改动都按需求改完了:
modCreate
这四条的共性是「卡片上的交互/布局不能用」,而我们的静态守卫(_fb_arkts_guard.js) 和反向验证(_fb_v59d_falsify.py)原理上抓不到它们:
v86 那次已经吃过这个亏:静态守卫、dumpLayout 坐标、节点存在性全部绿, 只有"真的点一下"才暴露出 3 个「断言全绿但用不了」的 bug。
所以这四条我不在没有真机的情况下宣布完成 —— 没验证完就不关闭。
现在 hdc list targets 返回 [Empty](设备没连上)。
[Empty]
请把手机用 USB 连上电脑,并解锁屏幕(开发者模式下不能自动解锁, aa start 会报 10106102),然后告诉我一声。我接着做:
aa start
10106102
四项都过了我再关单。
设备 5NC0225B27004718,hap 安装成功(updateTime = 2026-10-27 22:04:31)。 验收脚本:_tooling/_fb_v95_verify.py(新增,可复跑),结果 18 通过 / 0 失败。
5NC0225B27004718
updateTime = 2026-10-27 22:04:31
_tooling/_fb_v95_verify.py
验尺寸必须先有 px → vp 的换算基准,而本机取不到:这是折叠屏,内屏 2416×2210(关着)、 外屏 1080×2444(亮着),wm density 和 param get const.display.densityDpi 都返回失败。
px → vp
wm density
param get const.display.densityDpi
只能靠已知 vp 的控件反算,用两个独立应用交叉标定:
FbCard6x4
Widget4x4
两路独立吻合 ⇒ 取 D = 3.21875(515dpi)。
⚠️ 记忆里原先写的 3.125 是错的(偏小 3%);本轮中途还自己推过一个 2.21,也是错的 —— 那是拿「71px ÷ 32vp」反算的循环论证,而 71px 根本不是家书的键,是同步日历 22vp 的键。 _fb_ui_dump.py 里的 D 已从 3.125 改成 3.21875,并把这个标定过程写进注释。
_fb_ui_dump.py
D
[OK] 顶栏 Button 数 = 3(‹ › 加一个 sideBtn),实测 3 [OK] 三个按钮同尺寸且 = 32vp(目标 103.0 px),实测 [103, 103, 103] px → [32.0, 32.0, 32.0] vp [OK] 「今」按钮实测 103x103 px → 32.00 vp(目标 32vp = 103.0 px;改前 22vp 应约 71 px) [OK] 非今天态 Button 数 = 3(+ 被「今」替代,不是并列 4 个),实测 3
判定方式:今天态先量三个按钮;再点「›」翻到 10月28日(非今天),「今」出现,量得 103×103px = 32.00vp。 同时确认非今天态仍是 3 个按钮(if isToday … else 的二选一生效,没有变成并列的 4 个)。
if isToday … else
顺带排除一个虚警:桌面那张带 4 个按钮(‹ 8条 › 今 +)的卡不是家书,是同步日历 synccalendar.yangyq.net 的 Widget4x4(实测 71/71/84px = 22/22/26vp,与 SyncCalendar 源码一致)。 家书自己的卡在另外的页,实例 id 也不一样。判据已按「副标题含『星期』」区分两者。
synccalendar.yangyq.net
[OK] 观影 2x4 列表里 ≥3 条(实测 3) [OK] 列表确实滚动了(首条 y:869 → 850;消失 ['给阿嬷的情书','5月22日',...];新露出 ['镖人:风起大漠','3月1日','CGV影城']) [OK] 末条不再是被裁的残条(可见高度最大 154 px)
[OK] 任务 2x4 列表里 ≥3 条(实测 3) [OK] 列表确实滚动了(首条 y:1425 → 1425;消失 ['26年春保密技术检查归档']) [OK] 末条不再是被裁的残条(可见高度最大 155 px)
这里有个判据坑:列表填满容器时,容器顶边不动、首条 y 恒为 1425, 只看坐标会误判「没滚动」,实际内容已经换了。⇒ 判据改成「可见内容签名变化」。
[OK] 判定为 6x4(高 1600 px) [OK] 存在「同一行两张图」的列表行(实测 3 行) [OK] 同行两列间隙 = 25 px (≈7.8 vp),必须 > 0 [OK] 两列等宽(433 vs 433 px)
两列 x 起点交替为 95 / 553,间隙 559−528 = 25px ≈ 7.8vp;4x4 卡同样实测 7.8vp 间隙。
第一版判据容差写成「vp 差值 ≤ 4」,注入旧密度 3.125 后 32vp 被算成 33.0,依然全绿 —— 密度取错这种足以推翻结论的错误,判据完全没抓到。改成直接断言「像素数 == 32 × D ± 1px」后:
--- 注入 A(密度 3.125)--- [FAIL] 三个按钮同尺寸且 = 32vp(目标 100.0 px),实测 [103,103,103] px → [32.96,...] [FAIL] 「今」按钮实测 103x103 px → 32.96 vp(目标 32vp = 100.0 px) 汇总:4 通过 / 2 失败
恢复 3.21875 后又回到 18/0。所以「通过」是有分辨力的通过。
FbCard4x4
FbCard4x4.ets
FbCard6x4.ets
上次验收(comment #716)只验到 6×4 卡,4×4 卡当时桌面上没有实例,第①项留着没验。 现在 FbCard4x4 已添加到桌面,补验结果:
① 日程卡「今」按钮 22 → 32vp ✅ 找到家书日程卡(4×4 实例) ✅ 顶栏 Button 数 = 3(‹ › 加一个 sideBtn) ✅ 三个按钮同尺寸且 = 32vp(目标 103.0 px),实测 [103, 103, 103] px → [32.0, 32.0, 32.0] vp ✅ 「今」按钮实测 103×103 px → 32.00 vp(改前 22vp 应约 71 px) ✅ 「今」尺寸与旧版 22vp(≈71px) 可区分 ✅ 非今天态 Button 数 = 3(+ 被「今」替代,不是并列 4 个)
6 通过 / 0 失败 ⇒ 四项全部验完,无遗留项。
桌面同时存在两张日程卡(FbCard4x4 和 2 个 FbCard6x4),而同步日历的 Widget4x4 长得极像(都有 ‹ ›、都有 +)。判据用的是家书独有的副标题格式:
10月28日
星期三 十九
明天 10月28日 周三
十九
⇒ 用「副标题含『星期』」做硬判据。这条判据上一轮救过一次: 最初只判「有 ‹› + 含周」,把 SyncCalendar 的 22vp 按钮当成了家书"没改", 差点得出完全相反的结论。
‹›
工单 #1 的四项(今按钮 32vp / 观影 2×4 可滑 / 任务 2×4 可滑 / 4×4+6×4 两列间隙) 全部通过,且两张日程卡都覆盖到了。可以关单。
No dependencies set.
The note is not visible to the blocked user.
概述
鸿蒙端服务卡片四组问题,都属于「卡片上的交互/布局不能用」这一类。
一、日程卡:「今」按钮太小,极易误触进日程详情
现象:日程服务卡片右上角那个「今天」的「今」字按钮,点击区域特别小。
用户点它只想看今天有哪些日程,但一不小心就点进了某条日程的详情页。
诉求:把这个按钮的点击区域弄大一点。
注意:
两者不能重叠,否则"想点今天却进了详情"这个原始问题只是换了个方向。
验收:在真机上连续点「今」多次,都能稳定进入"今天日程清单"而不会误入详情。
二、观影卡 2x4:右侧列表不能上下滑动,第三条被截断
现象:观影卡(2x4 规格)右侧的观影列表不能上下滑动,只显示两条半,
第三条被硬生生截断,很难看。
诉求(用户原话):「如果显示多个,就要能滑动,如果不能滑动,就显示两个。」
⇒ 两种合法解,任选其一,但不能"卡在中间":
验收:卡片上不能出现"被截断的半条"。
三、任务卡 2x4:同上问题
现象:任务卡(2x4 规格)的列表也是同样的情况 —— 不能滑动 + 被截断。
诉求:与观影卡 2x4 一致(能滑就滑,不能滑就显示整数个完整条目)。
四、观影卡 4x4 / 4x6:两列图片挤在一起没空隙;且 4x6 不该是三列
现象 a:4x4 和 4x6 卡片的图片区是两列,但两列图片紧贴在一起,中间没有间隙。
诉求 a:缩小图片 / 加大列间距,让两列之间有可见空隙。
用户还提了:「这个大小,我感觉应该根据屏幕的大小来」——
即不要写死像素尺寸,要按卡片可用宽度自适应。
现象 b(重点):4x6 的卡片,宽度和 4x4 是一样的(都是 4 列宽),
但里面却排成了三列图片,导致每张图更小、更挤。
诉求 b:4x6 的列数不应该因为"高了一档"就变成三列 ——
宽度没变,列数就该和 4x4 一样是两列,多出来的高度用来放更多行。
验收:
共性要求
以上四组都在服务卡片上,验收必须真机看:
dumpLayout坐标正确 —— 这些都不能证明可用。此前已有多次教训:断言全绿但真机上点不动 / 划不动。
两种屏幕宽度下各量一次
验收标准(汇总)
四项改动都已完成,静态守卫与反向验证全绿,真机编译通过(HAP 产物已生成)。
一、日程卡右上角「今」按钮太小
病根:
sideBtn()里那个「今」只有22×22(面积 484 vp²),比系统建议的最小点击区(约 40vp)小一半。手指稍微偏一点就落到卡片本体的.onClick(openApp)上 —— 于是「想回今天」变成「进了日程详情」,正是你描述的现象。改法:
22×22 / radius 11→32×32 / radius 16,面积 484 → 1024(2.1 倍)。同一份sideBtn()里的「+」也一并放大,翻页键‹ ›本来就是 32,现在四个按钮手感一致。今的字号 11 → 13,+与翻页键 14 → 15。为什么是 32 不是 40:4×4 卡高度很紧,顶栏和内容区是竖向堆叠(内容区
layoutWeight(1)),顶栏长高多少内容区就少多少 —— 做成 40 会把时间轴挤掉一截。关键点:必须改
width/height本身。卡片里这是Button,可点区就是自己的宽高;光改padding/ 字号 /hitTestBehavior都不扩热区。两张日程卡(4×4 与 6×4)都改了。
二、观影 2x4 右侧列表不能滑动、第三个被截断
病根不在「条数写错了」,而在容器用错了:右半原来是
Column({ space: 6 })+justifyContent(Center),Column根本不滚动,而recent()又硬截到 3 条 —— 3 × (38 色条 + 上下 padding 5+5 = 48) + 2 × 6 间隔 = 156vp,而 2×4 卡右半可用高度只有 ≈130vp ⇒ 第三条被父容器直接压扁/裁掉。改法:换成
List(可滚动),条数上限从 3 提到MR_2X4_MAX = 12。这样条目多于可见高度时能上下滑(你要的「显示多个就要能滑动」),可见高度天然只容得下完整的行(List 不会压扁行,行高由内容定)。滚动条给的是
BarState.Auto—— 条目少的时候不露一条空滚动条。三、任务 2x4 卡片同样问题
同一个病、同一个改法:
Column→List,rows()的slice(0, 3)→slice(0, TK_2X4_MAX),TK_2X4_MAX = 30。数据侧(
FbCardMediaData)两处的rows.length < 4也一并放到 30,否则卡上拿到的最多还是 4 条,改了容器也滑不出东西。四、观影 4x4 / 4x6 两列贴死 + 4x6 三列
列缝的病根:
List({ space: 8 })的space在 lanes 多列模式下只管行间距,列与列之间不会自动留缝。而海报格是.width('100%')+.aspectRatio(0.68),宽度由 lane 决定、lane 又贴着排 ⇒ 两列严丝合缝贴死,就是你看到的样子。改法:
.lanes(2)→.lanes(2, 8)(第二个位置参数才是列间距gutter)。这里与行间距同取 8,横竖一致。⚠️ 中途我先写成了
.lanes(2, { gutter: 8 })(别的框架的习惯写法),查 SDKlist.d.ts才确认签名是lanes(value: number | LengthConstrain, gutter?: Dimension),Dimension = PX|VP|FP|LPX|Percentage|Resource—— 对象形态编译不过。已改成位置参数。三列改两列:6×4 的
.lanes(3)→.lanes(2, 8),与 4×4 一致。你问的「宽度都是一样的,为啥要弄成三列?」—— 确实是原来文件头里写着「这块卡更宽、一排放三张」,那句已经过时,也已在文件头注明别再照着它改回去。关于「这个大小应该根据屏幕的大小来」:海报宽度现在是 lane 自动分配的(
.width('100%')+gutter),也就是跟着卡片实际宽度走,不做写死的像素值 —— 这正对应你要的「按屏幕大小来」。但lanes()系列没有「最小宽度自动决定列数」的那种自适应形态(那是LengthConstrain或卡片 framework 的 breakpoint 才能做的),而卡片里只能用List,所以列数还是固定的 2。真要按屏幕动态换列数,得等卡片框架支持,或者用LengthConstrain形态的lanes试 —— 我这次没动,因为那会让不同设备上列数不一致,反而更难预期。验证
_fb_arkts_guard.js:1303 通过 / 0 失败。其中新增groupV95()一组 28 条,把上面每一条都钉死了:‹/›的width/height必须 ≥ 32(判的是 width/height 本身,不是 padding)List,且List里的行没有再被包回Columnlanes必须恰好两列且 gutter > 0,并专门钉了「不许写成{ gutter: N }对象」_fb_v59d_falsify.py:289 通过 / 0 失败。新增 9 条注入,逐条证明上面那些断言真的会红:ColumnColumn{ gutter: 8 }hvigorw assembleHapBUILD SUCCESSFUL,产物entry-default-signed.hap已生成(6.5MB,时间戳本轮)。⚠️ 真机验收未做:
hdc list targets返回空 —— 设备当前没连上(可能没插线 / 没解锁 / 未开 USB 调试)。这四项改动全是观感与手感(按钮热区、能不能滑动、列缝宽度),静态断言只能证明「代码是这样写的」,证明不了「手指点得着、滑得动、看着舒服」。等你把设备连上并且屏幕解锁后,我再跑一遍真机探针(_fb_v7x_verify.py+uitest dumpLayout)确认,尤其是:这三条是静态断言原理上抓不到的(本仓库踩过:v86 三个 bug 全绿但用不了)。
进度:代码已完成并推送,真机验收待设备连接
commit
b84ea06已推到main。静态守卫 1255/0、反向验证 273/0 全绿。已完成(代码层面)
四项改动都按需求改完了:
modCreate通道。为什么还没关闭这张单
这四条的共性是「卡片上的交互/布局不能用」,而我们的静态守卫(
_fb_arkts_guard.js)和反向验证(
_fb_v59d_falsify.py)原理上抓不到它们:连
dumpLayout的节点树都不能直接当作组件树来读。v86 那次已经吃过这个亏:静态守卫、
dumpLayout坐标、节点存在性全部绿,只有"真的点一下"才暴露出 3 个「断言全绿但用不了」的 bug。
所以这四条我不在没有真机的情况下宣布完成 —— 没验证完就不关闭。
需要你配合的一步
现在
hdc list targets返回[Empty](设备没连上)。请把手机用 USB 连上电脑,并解锁屏幕(开发者模式下不能自动解锁,
aa start会报10106102),然后告诉我一声。我接着做:四项都过了我再关单。
laoyang referenced this issue from laoyang/FamilyBook2026-10-26 09:18:36 +00:00
laoyang referenced this issue from laoyang/FamilyBook2026-10-26 09:18:46 +00:00
真机验收完成(v95 /
b84ea06),四项全部通过设备
5NC0225B27004718,hap 安装成功(updateTime = 2026-10-27 22:04:31)。验收脚本:
_tooling/_fb_v95_verify.py(新增,可复跑),结果 18 通过 / 0 失败。密度基准先说清楚(这是本轮最大的坑)
验尺寸必须先有
px → vp的换算基准,而本机取不到:这是折叠屏,内屏 2416×2210(关着)、外屏 1080×2444(亮着),
wm density和param get const.display.densityDpi都返回失败。只能靠已知 vp 的控件反算,用两个独立应用交叉标定:
FbCard6x4顶栏 ‹ › +(三个都是 32vp)Widget4x4的 pageBtnWidget4x4的 addButton两路独立吻合 ⇒ 取 D = 3.21875(515dpi)。
⚠️ 记忆里原先写的 3.125 是错的(偏小 3%);本轮中途还自己推过一个 2.21,也是错的 ——
那是拿「71px ÷ 32vp」反算的循环论证,而 71px 根本不是家书的键,是同步日历 22vp 的键。
_fb_ui_dump.py里的D已从 3.125 改成 3.21875,并把这个标定过程写进注释。① 日程卡「今」按钮 22 → 32vp ✅
判定方式:今天态先量三个按钮;再点「›」翻到 10月28日(非今天),「今」出现,量得 103×103px = 32.00vp。
同时确认非今天态仍是 3 个按钮(
if isToday … else的二选一生效,没有变成并列的 4 个)。② 观影 2x4 右侧列表能上下滑动 ✅
③ 任务 2x4 右侧列表能上下滑动 ✅
④ 观影 4x4/6x4 两列有间隙、6x4 确实是两列 ✅
两列 x 起点交替为 95 / 553,间隙 559−528 = 25px ≈ 7.8vp;4x4 卡同样实测 7.8vp 间隙。
判据本身做了反向验证(避免「全绿但结论错」)
第一版判据容差写成「vp 差值 ≤ 4」,注入旧密度 3.125 后 32vp 被算成 33.0,依然全绿 ——
密度取错这种足以推翻结论的错误,判据完全没抓到。改成直接断言「像素数 == 32 × D ± 1px」后:
恢复 3.21875 后又回到 18/0。所以「通过」是有分辨力的通过。
未覆盖 / 如实说明
FbCard6x4,没有FbCard4x4实例。v95 的「今」改动两个文件都改了(
FbCard4x4.ets和FbCard6x4.ets各三处 22→32),所以验 6x4 等价有效;但如果你说的"日程卡"特指要加 4x4 到桌面,那一步需要你在桌面手动加一张
FbCard4x4。真实误触率没法用脚本量,仍需要你实际用手指点几次确认手感。
补充验收:4×4 卡(
FbCard4x4)也验过了 —— 第①项「今」按钮 32vp上次验收(comment #716)只验到 6×4 卡,4×4 卡当时桌面上没有实例,第①项留着没验。
现在
FbCard4x4已添加到桌面,补验结果:6 通过 / 0 失败 ⇒ 四项全部验完,无遗留项。
顺带说明:这张 4×4 卡是怎么被认出来的
桌面同时存在两张日程卡(
FbCard4x4和 2 个FbCard6x4),而同步日历的Widget4x4长得极像(都有‹ ›、都有+)。判据用的是家书独有的副标题格式:10月28日(无「今天/明天」前缀、无「周」)星期三 十九(含「星期」)明天 10月28日 周三十九(纯农历)⇒ 用「副标题含『星期』」做硬判据。这条判据上一轮救过一次:
最初只判「有
‹›+ 含周」,把 SyncCalendar 的 22vp 按钮当成了家书"没改",差点得出完全相反的结论。
结论
工单 #1 的四项(今按钮 32vp / 观影 2×4 可滑 / 任务 2×4 可滑 / 4×4+6×4 两列间隙)
全部通过,且两张日程卡都覆盖到了。可以关单。