Repository navigation
Releases
lycard 0.85.6
lycard 0.85.6
卡表更新:9952 → 10212 张(+260 张新卡)。
新增了什么
官方卡表已更新到 LO-7127-A,这次把缺的 260 张全部补齐:
| 卡种 | 数量 |
|---|---|
| 角色 | 220 |
| 区域 | 25 |
| 道具 | 14 |
| 事件 | 1 |
- 卡名和效果全部中文(10212/10212),不是只进数据没翻译
- 检索索引已重建 —— 新卡能按中文名、日文名、假名、罗马字搜到
- 卡图两套都齐:APK 内置 WebP 10212/10212;数据包原图 PNG 也同步扩到 10212 张
- 新卡的能力标记按术语表校正过([跳跃→[跳、[侧步→[横移、[回合恢复→[回合补正 等 173 处)
更新面板的两处修正
- 「下好了没」不再只看文件大小:万一 Release 没给 size,以前会一直显示「继续更新」,
明明下完了却点不了安装 - 去系统设置开完「安装未知应用」权限,回到 App 会自动接着装(以前还得再点一次)
装哪个
| 文件 | 说明 |
|---|---|
lycard-0.85.6-arm64.apk |
arm64 版(现在的手机基本都是),不确定选它 |
lycard-0.85.6-universal.apk |
全架构版(老机器 / x86 设备) |
lycard-0.85.6-arm64.apk.from-0.85.5.lycpatch |
差分补丁,给已装 0.85.5 的机器,App 自动挑 |
已经在用 0.85.5:在 App 里点更新即可,只会下十几 MB。
数据包(原图):需要原图的另外下载lycee_cards_v2.pack.part01/02/03再拼起来。
验证
flutter analyze干净;测试 257 条全过- 数据包索引偏移连续性、分卷拼回逐字节一致、三卷 sha256 均已校验
lycard 0.85.5
lycard 0.85.5
更新包从 573 MB 降到十几 MB —— 差分更新。
为什么以前每次都要下 573 MB
APK 里 86% 的字节是内置卡图(9952 张 WebP,共 493 MB),而这些图在版本之间
从来不变。所以以前的「更新」等于把同一批图反复下载一遍。
| APK 里装了什么 | 大小 | 占比 |
|---|---|---|
| 内置卡图(9952 张 WebP) | 493.4 MB | 86.0% |
| 原生库 arm64 | 36.8 MB | 6.4% |
| 原生库 其它架构 | 26.6 MB | 4.6% |
| 代码(dex) | 7.8 MB | 1.4% |
| 卡数据 JSON | 4.0 MB | 0.7% |
| 其它 | 3.8 MB | 0.6% |
真正的代码只有 7.8 MB。
这一版做了什么
- 差分更新:更新时只下「和上一版不一样的那部分」。
实测 0.85.4 → 0.85.5 只要 7.6 MB(整包的 1.3%;从 0.85.3 升上来是 12.6 MB),
手机上把它和已装的安装包拼起来(本地运算,实测 6 秒),得到的新包与原版
逐字节相同(SHA256 校验)。 - 失败自动回退:补丁对不上(比如你是从更老的版本升)、拼出来的校验不过、
磁盘不够 —— 任何一种情况都自动改用完整下载,不会把你卡在那儿。 - 更新完自动清理更新包:装上的旧包、下到一半又换版本的残包,启动时清掉。
一个更新包 573 MB,留着纯属白占空间。 - 更新面板会写清这次是差分(只下 13 MB)还是完整下载(573 MB),
以及进度、速度、剩余时间。
装哪个
| 文件 | 体积 | 说明 |
|---|---|---|
lycard-0.85.5-arm64.apk |
573.5 MB | arm64 版(现在的手机基本都是),不确定就选它 |
lycard-0.85.5-universal.apk |
616.2 MB | 全架构版(arm64 + 32 位 ARM + x86_64),老机器用 |
lycard-0.85.5-arm64.apk.from-0.85.4.lycpatch |
7.6 MB | 差分补丁 —— 这一版还用不上,见下 |
lycard-0.85.5-arm64.apk.from-0.85.3.lycpatch |
12.6 MB | 同上 |
⚠️ 这一次(0.85.4 → 0.85.5)还是得下完整包,573 MB差分的代码是这一版才写进去的。你手机上那个 0.85.4 根本不认识「补丁」这回事,
它只会照老样子去下整包。上面那两个补丁文件虽然挂在这儿,
但没有任何一个已发布的版本会去用它们。从 0.85.5 往后才是十几 MB。 这一次是最后一次大下载 ——
下一版(0.85.6)发布时会给 0.85.5 生成from-0.85.5的补丁,那时候才真正生效。
验证
flutter analyze干净;测试 249 → 256 条(新增 7 条:补丁挑选、应用补丁、
旧包不符 / 哈希不符 / 取消 的拒绝路径、更新完清理)。- 差分还原做过真实端到端验证(
tools/delta_e2e.dart):
· 0.85.4 + 7.6 MB 补丁 → 0.85.5,SHA256 逐字节相同 ✓
· 0.85.3 + 12.6 MB 补丁 → 0.85.5(跳版更新),同样逐字节相同 ✓
lycard 0.85.4
lycard 0.85.4
更新改成全程在应用内完成 —— 以前点「下载」是跳浏览器,现在从检查到安装都不离开 App。
这次改掉了什么
- 不再跳浏览器:以前点「下载 lycard x.y.z」是拿系统浏览器打开下载地址(或 Release 页面),
下完还得自己去「文件管理」翻出那个 APK 再点安装。现在是一条龙:
检查更新 → 在 App 里下载 → 下完直接拉起系统安装器。 - 下载看得见:显示已下 / 总量、实时速度、还剩多久。
下到一半把窗口关掉不会中断,回「关于」页能接着看、接着下。 - 断点续传:已下的那一段留在磁盘上,下次点「继续下载」带着
Range: bytes=N-接着下 ——
600 MB 不会因为断一次网就从 0 重来。服务端万一不支持续传(回了 200),会自动从头下,
不会把内容拼成双份。 - 安装包放哪:
/sdcard/Android/data/com.lycard.app/files/update/。
跟卡图数据包同一个大目录下面 —— 卸载 App 会一起清掉,也不会跑进相册或「下载」文件夹。 - 要的权限直说:Android 8 起要允许「安装未知应用」。没开的话面板会写明,并给一个
直接跳到那个设置页的按钮,不用自己去系统设置里翻。 - 挑包和校验照旧:按本机架构挑(arm64 手机拿 arm64 包,老机器拿全架构包);
下完核对字节数,短了直接报错,不会拿半个包去装。
装哪个
| 文件 | 体积 | 说明 |
|---|---|---|
lycard-0.85.4-arm64.apk |
573.5 MB | arm64 版(现在的手机基本都是),不确定就选它 |
lycard-0.85.4-universal.apk |
616.2 MB | 全架构版(arm64 + 32 位 ARM + x86_64),老机器用 |
校验值:
| 文件 | 字节 | SHA256 |
|---|---|---|
lycard-0.85.4-arm64.apk |
601,393,811 | 53861b3bdffa57f0f897bd0ad8aa3e12da0e328cb9ba0f8fecf5aec5f24d1b4f |
lycard-0.85.4-universal.apk |
646,155,181 | adf22d05b950286f1b2a9cdeced1c16c2a1531f171b456461b1cba0aa42c7c24 |
从 0.85.3 起,App 里点「检查更新 → 更新到 lycard x.y.z」会在应用内下载并安装,
不用再自己去文件管理里找包。
验证
flutter analyze干净;测试 227 → 249 条(新增 22 条:版本比较 / 按架构挑包 /
检查更新的解析与错误分支 / 断点续传 / 暂停保留已下部分 / 字节数不足必须报错 / 安装通道 / 面板)。- 挑包时用 Release 附件名当文件名,不从下载地址最后一段猜(真机地址可能是 CDN 短名)——
这条是写测试时发现的,顺手改掉。 - 断点续传两条路都测了:服务端支持 Range(206)时接在后面下、不支持(200)时从头下,
两种情况下最终文件都与源文件逐字节相同。
lycard 0.85.3
lycard 0.85.3
计算器体检 + 修复 —— 把「自动算值到底漏在哪」量了一遍,修掉漏算的写法和三处会算错数的地方。
这一版不动界面框架,改的都是数值算得对不对。
装哪个
| 文件 | 体积 | 说明 |
|---|---|---|
lycard-0.85.3-arm64.apk |
573.5 MB | arm64 版(现在的手机基本都是),体积最小 —— 不确定就选它 |
lycard-0.85.3-universal.apk |
616.2 MB | 全架构版(arm64 + 32 位 ARM + x86_64),老机器、或者不确定对方是什么机器时用这个 |
应用内「检查更新」会按手机架构自己挑。装完请先启动一次,再放卡图数据包。
自动算值:四个漏算的口子
计算器会把卡面上「放上场就生效」的效果自动算进数值。体检发现 4 种写法没被认出来:
[常時] 味方[花]キャラ全てに…—— 属性筛选[花]把[常時]顶掉了,常驻效果被误判成
「要用才生效」,本该自动算的变成要手点。现在先认行动标签([常時]/[誘発]/[宣言]…),
认不出来才退回原规则。能自动套用的 380 → 394 条。この[雪]キャラにAP-1、この<魔剣>キャラにAP+1—— 筛的只是自己身上的
属性/类型,目标仍然是「自身」,以前却落进「目标待定」(7 处)。DMG+[破棄したカードのEX]这种没写「に」的变量写法 —— 以前整条都不显示,
玩家根本不知道这张卡有变量效果(68 处 / 54 张卡)。现在会列出来让你填。キャラ全てに/バトル参加キャラ全てに= 双方全体 —— 以前落进「目标待定」,
只能点一格、数值会算少。现在放上场两边所有人一起吃(46 条)。
带「〜を除く」的 6 条读法不止一种(除的是自己那一边还是对面),仍然留给玩家点。- 充能上限:以前只认
[チャージ:N],このキャラに1枚チャージできる认不出来,
面板会显示「这张卡没有充能」。认得出的从 867 张涨到 1015 张(90%)。
会算错数 / 会误导的三处
- 充能到卡面上限就点不动了:以前加号能一直点,和面板自己写的「上限 N 张」自相矛盾。
卡面没写上限(认不出)的卡不挡,仍然可以手动记。 - 同编号两张卡不再互相干扰:给左边那张套上效果,右边那张不再跟着显示「已算上」;
撤销也不会把两处一起撤掉。 - 顶部「场上合计」只显示 AP/DP:SP、DMG 是每张卡各自的值(DMG 尤其如此,它是攻击力),
几方的加到一起没有意义。
顺手补的
- 「目标待定」的选卡面板改成双方都列(以前只给我方,目标在对面时选不了)。
- 修正的时机能改了(以前改错了只能删了重建);说明栏会回显原来写的是什么。
- 删掉一条修正后可以撤销删除。
验证
flutter analyze干净;227 条测试全过(新增 24 条:解析口径 18 + 交互 6)。- 另留了一个体检脚本
test/calc_audit_probe_test.dart:跑真实卡池(9952 张)把上面这些口径
都量一遍,以后改解析器重跑就知道涨跌。
校验值(下载断在中间是真实会发生的,对一下)
| 文件 | 字节 | SHA256 |
|---|---|---|
lycard-0.85.3-arm64.apk |
601,327,899 | d36e46ae1b60254227e0bb7f602472feac14a4cdbf3b46b35f055107a304bd10 |
lycard-0.85.3-universal.apk |
646,089,269 | 5b8c6406cdc42b9c340705e035195d0f5f53810fd0fb5adc4d972fc885c97213 |
全量体检口径(9952 张卡 / 10213 条解析结果):能自动套用 394 条、含条件 3536 条、
含变量 120 条、目标待定 619 条。另外 3777 张卡解析不出数值 —— 绝大多数是非数值效果
(未行动にする / 破棄 / ドロー / 移動),解析不出是对的,不是漏。
lycard 0.85.2
lycard 0.85.2 更新日志
版本:0.85.2+95
这一版没有改动界面功能,主要是把上一版留下的两件事收尾。
1. 「检查更新」不再挑错包
上一版开始同时提供 arm64 版和全架构版两个安装包。App 原来的挑包逻辑是「取附件列表里
第一个 .apk」,而 GitHub 是按文件名排序返回附件的(- 排在 . 前面)—— 于是全架构包
排到了前面,所有 arm64 手机去检查更新都会下到 616 MB 的全架构包。
现在改成按手机架构自己挑:
| 你的手机 | 拿到的包 | 体积 |
|---|---|---|
| arm64(现在的绝大多数) | lycard-<版本>-arm64.apk |
573.5 MB |
| 其他架构 | lycard-<版本>-universal.apk |
616.1 MB |
| 万一两个都没找到 | 退回第一个 .apk |
—— 保证不会因为匹配不上而检查失败 |
2. 同时提供两种架构的安装包
| 文件 | 体积 | 说明 |
|---|---|---|
lycard-0.85.2-arm64.apk |
573.5 MB | arm64 版,现在的手机基本都是,选它 |
lycard-0.85.2-universal.apk |
616.1 MB | 全架构版(arm64 + 32 位 ARM + x86_64),老机器或不确定时用 |
为什么全架构只大了 42 MB:卡的图和数据(约 518 MB)三个架构是共用的,
重复的只有原生库那部分。
数据包
卡图数据包没有变,还是原来的 lycee_cards.pack(3,919,354,515 字节)。
数据包没变就不用重拷 —— 覆盖安装会保留全部数据。
lycard 0.85.1
lycard 0.85.1
这一版全是你报的 4 个问题的修复,没有新功能。逐条对照:
1. 底栏「构筑」和「计算器」反了 —— 已修
底栏的标签顺序和页面顺序对不上:下标 1 挂着「构筑」的标签,指向的却是
计算器页。所以点「构筑」出来的是计算器、点「计算器」出来的是构筑。
现在两侧一一对应:检索(0) / 计算器(1) / 构筑(2) / 我的(3)。
「设置 → 默认栏」下拉里的顺序也一并对齐,旧存档的栏位选择会自动迁移。
2. 数值计算:改成「每张卡放上去就自动算」 —— 已修
之前只有解析出效果的卡才出现算值区,而且每一条都要手动点「套用」。
现在改成:
- 上卡即自动算:卡放上场,效果里「确定生效」的部分直接算进数值,不用点。
- 场地一变就整体重算:「味方キャラ全てにAP+1」这类全场效果,
后上场的卡也会吃到;把来源卡拿掉,它给的加成会从别人身上一起收回。
(只在放牌那一刻算一次的话,后来的卡就漏了 —— 所以做成重算。) - 算不准的绝不替你猜:
[誘発](触发)、[宣言](要用才生效、带代价的)、
含条件的、含变量的、目标要指定某一体的 —— 都不自动套,留在卡的面板里。 - 面板里每一条都标了状态,还能一键「剩下 N 条全部算上」(等于说「这些现在
都生效」);已经算上的显示「已算上 / 撤销」,避免同一张卡点两次重复计数。 - 自动算出来的条目也可以逐条改数值、删掉:改过的会留档,删掉的不会
在下次重算时又冒出来。
3. 呼出输入法时切卡组,闪一下不切换 —— 已修
「正在看哪个卡组」这个状态原来放在底部面板的 builder 里。输入法一弹出/收起,
面板会整体重建一次,状态就被清回 null —— 表现就是「点一下卡组只闪一下、
又被弹回搜索框」。状态提到面板外面了,键盘开着也能正常切。
4. 储存区改成挂在每张卡下面 —— 已修
之前是「双方各一整块」的池子,不对。储存区(置き場)是某一张场上卡的,
和充能一样挂在卡下面:
- 在卡的面板里新建/加减/删除,新建时如果卡面写到了「〜置き場」的名字
(比如「迷宮」「経験値」),会直接列出来给你点,也可以自己手填。 - 格子上和充能并排显示,带张数(例如「迷宮 2」)。
其它
- 测试从 191 条增加到 204 条,新增的都是覆盖上面这四点的
(上卡自动算、全场效果扩散与收回、储存区挂卡、要用才生效的不许自动套)。 - 构建:
android-arm64,601,327,899 字节。
lycard 0.85.0
lycard 0.85.0 更新日志
版本:0.85.0+93 构建目标:android-arm64
计算器大升级
① 位置:挪到「检索」和「构筑」之间
底栏现在是 检索 → 计算器 → 构筑 → 我的。
⚠ 底栏顺序改过,你之前设的「进入App默认显示」会自动迁移(旧「构筑」还是
构筑、旧「我的」还是我的,不会因为挪位置就跳到别的栏去)。
② 上卡:可以直接从自己的卡组里挑
点空格放牌时,弹窗顶部多了一排「我的卡组」——点一下就从那套卡组里选牌,
不用再按卡名一张张搜。默认还是「卡库搜索」,两边随时切。
③ 充能:记在每张卡下面
卡下面压了几张(充能)可以在面板里直接加减,格子上会显示「充能N」。
卡面写了 [チャージ:N] 的会告诉你上限是几张(例:上限 2 张);没写充能的
卡会明确显示「这张卡没有充能」,免得你记错。
④ 储存区:把「〜置き場」这类卡记下来
每种卡挂的置き場名字都不一样(「迷宮」「経験値」「卒業」「わるいこと」
「世界樹の種」…全库有 20 多种),所以名字自己填,不写死任何一张卡。
每方一个区域,可建多个,各自记张数。
⑤ 自动算数值:从卡面效果直接算
打开一张场上卡的面板,会看到「这张卡的数值效果」——App 把它卡面上的
数值加成解析出来了,逐条列着,点「套用」就加到场上:
| 标记 | 含义 |
|---|---|
| 可直接套用 | 目标和数值都明确,点了就算 |
| 有条件,需确认 | 效果带「〜の場合」这类前提,你自己判断现在算不算 |
| 含变量,需手填 | 像「+[破弃的张数]」这种算不出来,会先建一条空的让你填数字 |
目标怎么落也分得很清楚:
- 自身(「このキャラに」)→ 直接加到这张卡
- 我方全体 / 我方 AF 全体 / 我方 DF 全体 / 对方全体 → 直接加到对应那一批
- 我方 1 体 / 对方 1 体 / 対戦キャラ → 弹场上选卡让你点,绝不替你猜
解析覆盖面(全库 9952 张实测):6175 张卡能解析出 10142 条数值效果,
其中 6571 条可直接套用、3529 条带条件、49 条含变量。
⑥ 每一步都能查看、修改
修正列表按「上回合 / 此回合 / 应对 / 常时」分组,每条都带:
- 来源标签(手动 / 效果 / 自动)——一眼看出这条是哪来的
- 效果原文(自动套用来的会留着,点「改这条」能看到并核对)
- 改 / 删两个按钮:数值不对就自己改,不想算了就删掉
这条特别重要:自动算出来的数永远可以被你手动改,App 不会跟你犟。
质量门禁
flutter analyze:无问题flutter test:191 条全通过(新增:效果解析 14 条 + 计算器交互 12 条 + 数值口径 8 条)- 效果解析全量体检:解析出 10142 条,数值离谱的 0 条
tools/check_bottom_pad.py:通过- 卡图无损:APK 内 9952 张 WebP、0 张 PNG
顺带修的
- 底栏顺序变更的存档迁移:老存档里的栏位下标会自动迁移,且只迁一次
(用标记位保证,否则你下次再设「构筑」会被当成旧值又迁一遍)。 - 一个会导致崩溃的写法:面板里输入框的控制器在对话框退场动画期间被提前
释放(used after being disposed)——已改为不依赖控制器的写法,从源头避开。
lycard 0.84.1
lycard 0.84.1 更新日志
版本:0.84.1+92 构建目标:android-arm64
新功能:底栏多了「计算器」一栏
对局中要算的数(某个角色现在到底多少 AP/DP、场上总攻多少)一直靠心算,
这一栏就是把它交出去。
-
场上就是规则的 6 格:前面 3 格 AF(攻击区)、后面 3 格 DF(防御区),
双方各一块,和「对战规则」页写的是同一套口径。 -
点空格放牌:从卡库里搜卡名/卡号选一张放上去;卡面基础值直接读卡表。
-
点场上的牌加修正,每条修正都挂在时机上:
时机 用途 上回合 上回合留下、这回合还在生效的 此回合 本回合自己做的 应对 对方应对时做出来的 常时 道具/区域这类一直在场上的 每条修正可以写一句说明(也可以留空不写),四个数值可正可负。
-
实时显示:格子上直接盖着一行当前值,被修正过的项会高亮并标出增减量
(例如AP5旁边一个+2);顶部还有双方场上合计,以及每个时机
各贡献了多少(修正 上回合 +2 / 应对 −1)。 -
一键清空:顶栏扫把图标,双方场地一起清。
数值口径:当前值 = 卡面基础值 + 全部修正。修正只是记「因为什么变了」,
所以四个时机的修正是全部一起加上去的,时机只用来归类显示 —— 这样你
一眼就能看出这几个数是谁弄出来的。
这一栏不保存:局内是一次性的,退出 App 即清空(按你的选择)。
修了一个会让人点错卡的 Bug:效果文本里的「假卡名」
效果文本里能点卡名跳转,但匹配时有个漏洞:日文片假名没有空格,一个
短名字只要出现在更长的词里,也会被当成卡名引用。全量体检量出来的实情:
| 假命中 | 出现次数 | 它实际在哪个词里 |
|---|---|---|
| 「チャー」 | 1902 | チャージ(充能,规则词) |
| 「ナル」 | 568 | ペナルティ(惩罚,规则词) |
| 「リト」 | 25 | リトルバスターズ(作品名) |
| 「リシア」 | 22 | パトリシア(别的角色名) |
| 「メイ」 | 19 | ガールズ・ブック・メイカー |
| 其余 9 个 | 42 | リリィ/ルイス/アキナ… |
也就是说:任何提到「充能」的效果里,都凭空多一处指向 LO-1239 的假链接,
点下去跳到一张完全无关的卡。
修法不是加词表,而是用片假名自己的边界:带片假名的名字必须占满整个
片假名词组才算引用;被夹在更长的片假名词里的,一律不当引用。汉字没有这种
天然边界(「言霊」可能真是复合词的一部分),所以这条只对全片假名名字生效。
效果(全库 9952 张跑一遍):
| 修之前 | 修之后 | |
|---|---|---|
| 识别到的卡名引用总数 | 7108 | 4581 |
| 其中 2 字卡名 | 776 | 161 |
| 多候选里首选不是同系/同会社 | 596 | 14 |
| 该认却没认的 2 字卡名 | 0 种 | 0 种 |
被拦掉的 2578 处,逐条核过上下文,全部是更长词里的片段,没有一条真引用
被误杀(例如「味方「ルミ」」这种独立出现的仍然照认)。
另外,全量体检脚本自己也有一条判定和产品代码不一致(它只认识「更长的卡名」,
不认识「更长的片假名词」),会把产品代码本来正确的行为误报成「漏掉」——
已按同源口径修好,并补了 6 条回归测试钉住这个边界。
底栏胶囊下半部分多出一块空白(0.83.6 起已修)
根因是系统手势安全区被包进了胶囊里面:NavigationBar 内部会把
viewPadding.bottom(本机 20dp)加在自己高度下面,主题里设的 68 就变成了 88,
而这 20dp 被悬浮胶囊连玻璃一起糊住了。
修法是结构性的:安全区归安全区、胶囊归胶囊 —— 悬浮胶囊把这段安全区算进
自己的底部外边距,同时让内部 NavigationBar 不再重复让位。图标和文字
在屏幕上的位置一点没动,只是玻璃不再多包那 20dp。
界面一致性
新增/改动的几处选择器都换成了项目统一的小标签组件(LyTag):计算器的时机、
卡组导入的识别系统、反馈页的类型与快捷收录。原因是 Flutter 的
SegmentedButton 高亮块和外框永远对不齐、Chip 系列去不掉自带的底色,
用统一组件才不会有"这块看着脏"的问题。
质量门禁
flutter analyze:无问题flutter test:168 条全通过(含新增的 8 条计算器数值口径、3 条计算器交互、6 条卡名片段回归)tools/check_bottom_pad.py:通过(带底栏界面的滚动留白与贴底按钮让位都对)- 卡图无损:APK 内 9952 张 WebP、0 张 PNG
lycard 0.83.6
lycard 0.83.6 更新日志
Bug 修复(本版新增)
底栏胶囊下半部分多出一块空白
底栏玻璃胶囊里、图标文字下方凭空多了一块空白,而且胶囊贴得离屏幕边缘很近。
根因(量出来的,不是估的):
| 项 | 数值 |
|---|---|
主题里 navigationBarTheme.height |
68 |
Flutter NavigationBar 内部的 SafeArea 又加上的系统手势安全区 |
20 |
实际 NavigationBar 高度 |
88 |
| 胶囊自身底部外边距 | 14 |
| 底栏总占用高度 | 102 |
NavigationBar 内部会把系统手势安全区(viewPadding.bottom)加在自己高度的下面,而这 20dp 被悬浮胶囊连玻璃一起包了进去 —— 所以看着就是「文字下面空一块」。
修法(结构性的,没有写死任何补偿数值):
安全区归安全区、胶囊归胶囊。悬浮胶囊把那段安全区算进自己的底部外边距,同时让内部 NavigationBar 不再重复让位:
| 修复前 | 修复后 | |
|---|---|---|
NavigationBar 本体高度 |
88 | 68 |
| 底栏总占用高度 | 102 | 102 |
图标与文字在屏幕上的位置完全不变(下方让位总量仍是 20 + 14),页面底部预留空间也无需调整;变的只是玻璃不再多包那 20dp 空白。通栏模式不悬浮,安全区仍留在内部,行为不变。
另外新增了底栏尺寸诊断开关(与既有的 FRAME_LOG 同风格):用 --dart-define=LAYOUT_LOG=1 构建时,启动会把底栏实际高度、系统安全区、界面缩放打到日志里,以后再遇到这类「多出一块/少了一块」的问题可以直接量,不用猜。
以下为 0.83.5 起已包含的完整内容:
版本:0.83.6+90 构建目标:android-arm64
功能更新
1. 卡表数据热更新
卡表、中文翻译、卡名词条、禁限卡表、模糊搜索索引这五类数据现在可以脱离 APK 单独更新。
- 读取顺序:App 目录里的热更数据优先,读不到才用内置资源 —— 热更包缺失或损坏都不会让 App 起不来
- 入口:
数据与备份 → 卡表数据热更新 - 「从文件选择数据包」支持:
.zip数据包(里面放数据文件即可,放子目录里也认;可选放一个data_version.json提供版本号和说明)- 单个数据文件(例如只更新
banlist.json)
- 只接受白名单文件名,数据包里混进图片、APK 之类不会被写进 App 目录
- 可以一键「回退到内置数据」
- 数据在启动时载入,所以装完需要重启 App 才生效(提示里如实说明,不假装已经生效)
卡图不在热更范围内:仍然走「内置压缩 WebP + 外挂原图包」两条路。
2. 打印卡图
卡组 → 更多 → 打印卡图…
- 按真实卡牌尺寸 63×88mm 排版,A4 每页 9 张(3×3)居中,每张带极细裁切框,打印店按框裁即可
- 两种出口:导出 PDF 或直接走系统打印
- 图片质量把关:
- 有外挂原图包 → 用无损原图
- 只有内置压缩图 → 先明确提示「当前不是原图」,用户确认后才继续
- 完全没有图 → 提示无法打印,不会静默生成一堆空白框
- 内置卡图是 WebP,PDF 库只认 PNG/JPEG,这里用 Flutter 自带解码器转成 PNG,没有为转格式额外引入图像依赖
- 排版期间显示进度条(60 张要逐张转格式,避免界面看着像卡死)
3. 卡组导入:两套识别系统
导入对话框现在让你自己选用哪套识别系统,不用再把链接粘进去反复试:
| 识别系统 | 形式 | 是否需要联网 |
|---|---|---|
| lycard 分享码 | LYD1…,离线解析 |
否 |
| 官方卡组链接 | https://lyc.ee/d<ID> 短链 / https://lycee-tcg.com/d/?d=<ID> 长链 |
是 |
- 两套之外还有「自动识别」:
LYD1开头按分享码,含官方域名按官方链接 - 官方页面解析:
- 卡组名取自「デッキ名」那一行
- 卡表按
<td>N枚</td><td>卡号</td>解析 —— 这样异画后缀(如LO-2690-K)能保留 - 表格缺失时退回页面里的
deckline=1691:1,0701:4,…兜底 - 已用真实官方页面验证:卡组名、22 组卡、合计 60 张全部解析正确
- 官方页不提供「主战卡」,导入后会提示你自己补上
- 剪贴板监听也走同一套识别,粘官方链接同样能导入
4. 反馈通道:待收录项一键模板
我的 → Bug / 功能反馈 新增「快捷收录」:
- 卡名待译 —— 卡名还是纯日文/外文,模板已带好「卡号 / 现在的卡名 / 建议译名」
- 效果待译 —— 效果文本里残留日文片段,模板已带好「卡号 / 残留的片段 / 正确写法」
选一下就自动填好模板,你只要补卡号。报告里会带上「主题」一行,方便归类。
Bug 修复
- 列表性能残留:
构建页与想要/出卡页的列表项此前仍在context.watch<AppState>(),会导致整个 AppState 变化时逐项重建;已改为read<AppState>(),由父列表统一刷新。扫描结果:列表项全量监听 3 → 0 - 修复数据热更新接入
search_keys.json.gz时的类型错误(rootBundle.load返回ByteData,需要取buffer.asUint8List()) - 修掉热更服务里一处永远不成立的空判断
安装包
- 内置压缩卡图:9952 张 WebP,APK 内 PNG 卡图 0 张
- 构建已开启
noCompress += "webp":WebP 不再被 Android 二次 ZIP 压缩,图片内容不变,只是构建更快、解包更省事
质量门禁
flutter analyze:无问题flutter test:151 条全部通过(新增 9 条官方卡组链接解析测试)- 底栏避让检查:通过
- 列表监听检查:通过
已知事项(待办)
- 新按钮 / 新提示的中文原文尚未补多语言表(繁中、英、日、俄、韩)。缺失时自动回退显示中文,不影响使用。
- 少量卡名仍是纯日文/外文(多为武器名、技能名、外来语专名,没有可靠统一的中文译名)
- 部分效果文本方括号内仍有日文片段(规则关键词、作品名、置场名等),需逐条人工校对
- 滚动流畅度仍只有静态检查结论,真机帧率数据待补
- 官方链接导入依赖联网与官方站点可访问性;打不开时会明确报错,不会静默失败
lycard 0.83.5
lycard 0.83.5 更新日志
版本:0.83.5+89 构建目标:android-arm64
功能更新
1. 卡表数据热更新
卡表、中文翻译、卡名词条、禁限卡表、模糊搜索索引这五类数据现在可以脱离 APK 单独更新。
- 读取顺序:App 目录里的热更数据优先,读不到才用内置资源 —— 热更包缺失或损坏都不会让 App 起不来
- 入口:
数据与备份 → 卡表数据热更新 - 「从文件选择数据包」支持:
.zip数据包(里面放数据文件即可,放子目录里也认;可选放一个data_version.json提供版本号和说明)- 单个数据文件(例如只更新
banlist.json)
- 只接受白名单文件名,数据包里混进图片、APK 之类不会被写进 App 目录
- 可以一键「回退到内置数据」
- 数据在启动时载入,所以装完需要重启 App 才生效(提示里如实说明,不假装已经生效)
卡图不在热更范围内:仍然走「内置压缩 WebP + 外挂原图包」两条路。
2. 打印卡图
卡组 → 更多 → 打印卡图…
- 按真实卡牌尺寸 63×88mm 排版,A4 每页 9 张(3×3)居中,每张带极细裁切框,打印店按框裁即可
- 两种出口:导出 PDF 或直接走系统打印
- 图片质量把关:
- 有外挂原图包 → 用无损原图
- 只有内置压缩图 → 先明确提示「当前不是原图」,用户确认后才继续
- 完全没有图 → 提示无法打印,不会静默生成一堆空白框
- 内置卡图是 WebP,PDF 库只认 PNG/JPEG,这里用 Flutter 自带解码器转成 PNG,没有为转格式额外引入图像依赖
- 排版期间显示进度条(60 张要逐张转格式,避免界面看着像卡死)
3. 卡组导入:两套识别系统
导入对话框现在让你自己选用哪套识别系统,不用再把链接粘进去反复试:
| 识别系统 | 形式 | 是否需要联网 |
|---|---|---|
| lycard 分享码 | LYD1…,离线解析 |
否 |
| 官方卡组链接 | https://lyc.ee/d<ID> 短链 / https://lycee-tcg.com/d/?d=<ID> 长链 |
是 |
- 两套之外还有「自动识别」:
LYD1开头按分享码,含官方域名按官方链接 - 官方页面解析:
- 卡组名取自「デッキ名」那一行
- 卡表按
<td>N枚</td><td>卡号</td>解析 —— 这样异画后缀(如LO-2690-K)能保留 - 表格缺失时退回页面里的
deckline=1691:1,0701:4,…兜底 - 已用真实官方页面验证:卡组名、22 组卡、合计 60 张全部解析正确
- 官方页不提供「主战卡」,导入后会提示你自己补上
- 剪贴板监听也走同一套识别,粘官方链接同样能导入
4. 反馈通道:待收录项一键模板
我的 → Bug / 功能反馈 新增「快捷收录」:
- 卡名待译 —— 卡名还是纯日文/外文,模板已带好「卡号 / 现在的卡名 / 建议译名」
- 效果待译 —— 效果文本里残留日文片段,模板已带好「卡号 / 残留的片段 / 正确写法」
选一下就自动填好模板,你只要补卡号。报告里会带上「主题」一行,方便归类。
Bug 修复
- 列表性能残留:
构建页与想要/出卡页的列表项此前仍在context.watch<AppState>(),会导致整个 AppState 变化时逐项重建;已改为read<AppState>(),由父列表统一刷新。扫描结果:列表项全量监听 3 → 0 - 修复数据热更新接入
search_keys.json.gz时的类型错误(rootBundle.load返回ByteData,需要取buffer.asUint8List()) - 修掉热更服务里一处永远不成立的空判断
安装包
- 内置压缩卡图:9952 张 WebP,APK 内 PNG 卡图 0 张
- 构建已开启
noCompress += "webp":WebP 不再被 Android 二次 ZIP 压缩,图片内容不变,只是构建更快、解包更省事
质量门禁
flutter analyze:无问题flutter test:151 条全部通过(新增 9 条官方卡组链接解析测试)- 底栏避让检查:通过
- 列表监听检查:通过
已知事项(待办)
- 新按钮 / 新提示的中文原文尚未补多语言表(繁中、英、日、俄、韩)。缺失时自动回退显示中文,不影响使用。
- 少量卡名仍是纯日文/外文(多为武器名、技能名、外来语专名,没有可靠统一的中文译名)
- 部分效果文本方括号内仍有日文片段(规则关键词、作品名、置场名等),需逐条人工校对
- 滚动流畅度仍只有静态检查结论,真机帧率数据待补
- 官方链接导入依赖联网与官方站点可访问性;打不开时会明确报错,不会静默失败