10 月 2 日,我的微信读书会员到期了,我没续。
不是舍不得那点钱,而是我在墨水屏上用它的每一次,都在跟它较劲:想划线,得跟两个小圆点手柄打架;想知道自己读了多少,它连个数据页都没有。
会员到期的第二天,我把攒了半个月的念头落了地——给自己写了个墨水屏阅读器。

微信读书在我的汉王上难用在哪
我的阅读设备是汉王 Clear7(HANVON P7):7 寸墨水屏,Android 14,1264×1680。用它看微信读书,有两件事特别难受。
一是没有阅读数据页。 看了多久、这个月比上个月多读了多少、今年累计读了多少小时——墨水屏版里一概看不到。手机版有,墨水屏版没有。翻页翻得挺热闹,回头一想,没有任何东西能证明我读过。
二是划线不能按句子、按段落来。 墨水屏和手机不一样:刷新慢、有残影,手指去拖那个选区手柄是“按住—等—再按住—再等”的体验。我只想表达“这句话我要划下来”,结果每次都在跟手柄较劲。而且它的选中范围时大时小,划歪了还得重来一遍。
我的需求其实很朴素:点一下,把这句话划下来;抬个头,能看见自己这周读了几小时。
于是我自己写了一个
给这台机器写了个阅读器,包名 com.awen.ereader。顺手把汉王自带的那套桌面和阅读器也换掉了(随时能切回去,没动系统里的东西)。
现在书架里 63 本:已读 35、在读 1、未读 27。epub 的封面直接从书里抽,txt/md 就按书名生成一张排版封面;未读/在读/已读三个选项卡;长按一本书能标记已读、导出笔记、移出书架;侧面那对翻页键在书架里是挪光标的。
几个实现上的取舍,都是被这台机器逼出来的:
- 不引 gradle。一台自用的墨水屏阅读器,没必要背一整套 Android 构建系统:
aapt2 + javac + d8 + zipalign + apksigner五步,./build.sh一条命令出 APK,不联网拉依赖,改一行字重新装上去只要十几秒。 - epub 自己解。zip →
META-INF/container.xml→ opf → spine,顺手把dc:title、dc:creator和每章标题读出来。txt 一律 UTF-8 严格解码,失败就退 GB18030(中文老书很常见)。 - 排版用
StaticLayout按屏切页:字号 12–40、行距、段间距、边距、首行缩进、两端对齐、白纸/米色/夜间三种背景、自定义字体,改完立刻生效且停在原位。
墨水屏不是普通屏幕
写这个 app,有一半时间不是花在功能上,而是花在伺候这块屏上:
- 它刷新慢,还留残影。所以书架滚动期间完全不整刷,停稳 2 秒才整刷一次,6 秒内最多一次;翻页则攒够 6 页才做一次整屏刷新。
- 侧面的翻页键,在系统眼里就是音量键。默认按一下弹一个巨大的音量框,在墨水屏上要刷两遍、还留一屏残影。现在这两个键被 app 吃掉:书架里挪光标,阅读时翻页,再也不弹音量条。
- 另留了一个「整屏刷新」键(
KEYCODE_REFRESH),哪一页看着不爽,按一下刷干净。 - 阅读页一律不弹提示条。圆角白底加 app 图标那种 toast,在墨水屏上看着像系统通知,既压正文又留残影——加书签、划线、存笔记、复制,做完就是做完了,没有“已加书签”。
划线:点一下,剩下的交给句子
这是我最想解决的一件事。现在的流程是这样:
- 长按正文,只选中按住的那一个字/词(用 Android 自带的 ICU 分词,“显微镜”不会拆成“显微/镜”);
- 操作条上有两个按钮:整句 / 整段,按下去自动把选区撑到整句或整段;
- 短按「划线」直接划(沿用上次的线型),长按才把线型/颜色那张卡调出来。

划线直接画在正文上,跨行贴合;点已划线的地方能看摘录和笔记,也能删。查词也在这一套里:拼音读音离线出(系统 ICU 的 Han-Latin,不联网不等),释义和中英互译交给模型——离线或者没配模型,读音照样显示。
我给它加了个数据页

累计阅读时长、今天读了多少、日/周/月/年切换的柱状图。就是我在微信读书墨水屏版里始终找不到的那一页。
书从哪来
趁着会员还没到期,我把想看的书搬了出来:写了个浏览器扩展抓微信读书网页版的正文,落成 markdown,再转成 epub,推到我自建的一台机器上(Rust 写的同步服务,零第三方 crate,签名和凭据信封都是自己实现的)。阅读器打开就同步,进度、笔记、书签一起同步。
所以 10 月 2 日会员到期的时候,我的书架已经搬完了。
顺手修掉的三个毛病
写这篇文章要截图,结果截图的时候又被自己写的东西气到,顺手修了三个:
- 「整句」会切在右引号上。书里常写“自己要做一个‘好的恋人’,也要去找一个‘好的恋人’”,原来的逻辑把右引号也当成句末标点,于是整句只选到
“好的恋人”就断了。现在的规则是:先扫到真正的。!?,再把后面的收尾引号一起带走。 - 「段间距 0」照样空一行。设置里写着 0 = 段落紧贴,可代码遇到 0 直接返回,空行照样占一整行——怎么拉都去不掉。读《为何家会伤人》时段落前面那条莫名其妙的空行,就是它。
- 中英之间的空格是乱的。这本 epub 是 PDF 转出来的,正文里到处是“自己总 算看到”“一 个月后”这种被塞进去的空格。现在中文和英文之间固定留一个空格(
换iPhone4→换 iPhone4),中文之间、中文和全角标点之间的空格全部删掉——光这一本就清掉一百多个。
现在的状态
- 书架 63 本,正在读《为何家会伤人》(升级版),10%。
- 朗读默认关着:豆包语音合成 2.8 元/万字符,一本 28 万字的书从头念到尾差不多 78 元,比会员贵。代码留着,想听了改个开关就能用回来。
- 还没有的:pdf / mobi / azw3、全文搜索、生词本。
微信读书我还会用,用来看书评和别人划的线。但**“在自己的墨水屏上,点一下就把这句话划下来,抬个头还能看见自己读了多少”**这件事,我决定自己动手。
评论
0 条评论