v73:家谱自绘重做(Canvas 画线 + 原生卡片),去掉列表只留图谱
用户原话:「手机端这个家谱实在是很难看,能有什么库之类的,让它好看点吗」 改法:不再全 Canvas 手绘(只有彩色圆点 + 首字,中文又平又硬、做不出圆角阴影), 改成「Canvas 只画线 + 原生 Column/Text/FbAvatar 绝对定位」。 不能改用 Path 组件:Path.commands 单位是 px,而 .position() 是 vp,混用会缩 1/3; Canvas 绘制坐标系本身是 vp,与 .position() 自洽。 布局算法抽成纯函数 common/KinLayout.ets(可单独验证,不再和"画"揉在一起): - 横向单位是「夫妻单元」而不是「人」,夫妻并排紧邻 - 子女挂在夫妻单元中点下方(family-chart 语义) - 迭代松弛 24 轮容纳冲突约束(家谱不是树:姻亲的"挂父母下方"与"夫妻并排"互相打架) - 全程确定性(排序带 minId 兜底),避免每次重画卡片抖位置 真机抓到并修掉两个真 bug: 1. 户号 0 被当成"没分户":服务端 unit_of 从 0 编号,端上判 > 0 ⇒ 我与妻子被拆两户(真机 Δx=680px)。修:布局层 >= 0,解析层缺失给 -1, 不把任何数值当哨兵。 2. 线没连对(用户原话「主要是线没连对」):buildBloodEdges 用 gen 数值当行号, minGen=-1 ⇒ 长辈线从 y=-148 起(屏幕外),整组线串到上一代卡片。 修:新增 rowIndex(gens, gen),用走标换算而不是数值。 验证: - 离线布局 29/0(含户号 0、脏数据一户三人、镜像常量与端上源码一致) - 反向验证 11/0(9 处注入,含"户号 0 当没分户"与"用 gen 数值当行号"两条真 bug 复现) - 真机几何 15/0、真实数据+屏幕对照 9/0(反解密度 3.125x,残差 0.23/0.32px; 12 个血缘线端点全部贴在卡片上下沿) - ArkTS 静态守卫 905/0
This commit is contained in:
@@ -463,7 +463,15 @@ export function parseKin(json: string): FbKinGraph {
|
||||
label: s(r['label'] as string),
|
||||
gen: n(r['gen'] as number),
|
||||
avatarColor: s(r['avatar_color'] as string),
|
||||
unit: n(r['unit'] as number),
|
||||
// v73:家谱卡片要显示头像(服务端一直返回,以前画圆点没解析)
|
||||
avatar: s(r['avatar'] as string),
|
||||
/* 🔴 v73:**不能**用 `n()` —— 它把 null/undefined 折成 0,
|
||||
而服务端的户号 `unit_of` 是**从 0 开始**编号的(户 0 是真实的一户)。
|
||||
⇒ 用 `n()` 会让"字段缺失"与"第 0 户"变成同一个值,
|
||||
布局层就无法区分,线上实测表现为「我与妻子被拆成两户」。
|
||||
这里统一成 -1 表示"没有户号",布局层只判 `>= 0`。
|
||||
⚠️ 别改回 `n(...)`,也别在布局层用 `> 0`。 */
|
||||
unit: r['unit'] !== null && r['unit'] !== undefined ? n(r['unit'] as number) : -1,
|
||||
// ⚠️ 从 `Record<string, Object>` 里取值必须**显式断言**成目标类型 ——
|
||||
// ArkTS 不会自动把 `Object` 收窄成 `number[]`(编译期报
|
||||
// "Argument of type 'Object' is not assignable to 'number[]'")。
|
||||
|
||||
Reference in New Issue
Block a user