compose multiplatform写一个简单的阅读器2

news/2025/3/3 6:48:02/

目录

pdf-toc" name="tableOfContents" style="margin-left:120px">解码全部换成mupdf

遇到的一些问题

相对上一篇文章修正的内容:

使用感受:

未来可能要完成的功能:


pdf" name="%E8%A7%A3%E7%A0%81%E5%85%A8%E9%83%A8%E6%8D%A2%E6%88%90mupdf">解码全部换成mupdf

android里面的pdf解析,背景没有了,换了mupdf就正常了.

解码的代码统一,省的麻烦了.

mupdf不只支持pdf,还支持epub/mobi这些,这在桌面端没有找到一个合适的阅读器,所以写桌面端.后来发现fbreader不错,缺点就是鼠标滚动有点恼火.

mupdf也支持ios,如果要做ios的也容易.

遇到的一些问题

上一篇简单地改造,有明显的bug,这次把bug修正了.且把解码的都换了mupdf,因为它是agpl v3,所以我也加了这个.源码放到了github上.dev分支上.GitHub - archko/KReader

完善的过程,发现几个问题.

  • mac intel的打包有问题,sqldelight打包失败.arm的没有问题.
  • 打包的时候,暂时无法把dylib打进包,对于gradle的打包还是不够熟悉,现在只能打完,然后放进去.
  • mupdf的引用,由于源码编译,发布到本地,所以做了两个,一个是aar,一个是jar.aar是androi在用,jar是桌面端用.windows,linux的包需要自己再打了.
  • lifecycle冲突的话,会导致打包成功,运行失败,但无报错.桌面端的换成org.jetbrains.lifecycle.
  • 要想实现界面的完全复用,恐怕不太容易,手机端与桌面端最大的差异是键盘,所以涉及到这个的只有分开.
  • kotlin代码,在公用模块,好像都是要public,否则是private的.
  • android里面的pdf解析,背景没有了,目前未知如何处理,以前好像修正过,后来忘了,导致一些图片解析后,背景透明,然后整个是黑的.换了mupdf就正常了.
  • bitmap由于要适配多平台,涉及到这个的,就需要不同平台有不同的实现了.

主要涉及的一些问题就是上面, 其它可能还没有机会遇到.

相对上一篇文章修正的内容:
  • 大纲滚动的焦点问题修正,之前是鼠标滚动只会滚动内容,添加了鼠标悬停与点击时的背景色
  • 移动端的换了mupdf解析.
  • mac打包的修改,去除dylib进jar
  • 添加了图片的简单缓存,避免滚动时的重复解码.

使用感受:

kmp,个人觉得,只用桌面端或只用于移动端的话会比较合适,并不合适一个代码用于桌面端与移动端.要修改的东西不少.当然相比整个重新写是省了不少事.

有so的aar,目前没有找到直接使用的方式,所以要么打一个jar不包含so,然后加一个dylib的引用,要么分开引用不同的包.目前我使用方式二,一个引用aar,一个引用jar,aar可以用mupdf官方的,手机端用.jar就只有自己弄了.

内存的占用偏高.相对其它pdf阅读器,pdf expert.

cpu占用偏高.相对qt,fbreader是用qt.

对于java/kt程序员,要写一个高质量的桌面端应用,是个不错的选择.虽然我觉得性能与那些比要差一些,实际还好,compose以后性能还会提升的.相比swing,这个太旧,学习成本是比较大,而android程序员的话,成本比较低.

material3的风格直接用上了.官方的demo有不少.

ios上的感受,目前没有时间搞,需要编译mupdf也比较麻烦.不太清楚它编译后的效果如何.

flutter也可以做桌面应用,有一个pdfrx,有基本的pdf功能了.但是pdf用ffi时,速度是真不咋地.而且它的移动端解码又只能调用系统的,通过channel传输,速度也是不行.

未来可能要完成的功能:

分块加载,目前是一个page一个图片,加载整个页面,对于桌面端还行,对于移动端尤其缩放是非常糟糕的.长条形的图片也会内存溢出.

只实现了加载图片,缩放功能未实现.手机端要复杂,桌面端要容易一些缩放后对整个view应该是容易.

解码需要重构

添加自动切边功能

手机端的功能需要把原来的app功能迁移过来.

添加滤镜.

添加webdav这些历史记录,这样多端可以统一历史记录了.

时间有限,手机的app目前有一个完整的实现了,可能后续去完善compose的动力不大.

更多会完善桌面端的功能,加入切边,历史记录同步.

有兴趣的人可以在github提pr.

手机端现在7.3版了,有兴趣也可以去增加功能.


http://www.ppmy.cn/news/1576226.html

相关文章

通过返回的key值匹配字典中的value值

需求 页面中上面搜索项有获取字典枚举接口,table表格中也有根据key匹配字典中的value 方案一 需要做到的要求 这里上面下拉列表是一个组件获取的字典,下面也是通过字典匹配,所以尽量统一封装一个函数,每个组件保证最少变动tabl…

苹果CMS泛目录优化全攻略:局部URL随机化与数据无缝对接

引言 在当今的SEO优化领域,泛目录和站群策略已经成为提升网站权重和流量的重要手段。苹果CMS作为一款功能强大的内容管理系统,其新版框架为开发者提供了丰富的二次开发接口,使得泛目录和站群策略的实现变得更加灵活和高效aoshunseo。本文将详…

基于STM32的智能家居能源管理系统

1. 引言 传统家庭能源管理存在能耗监控粗放、设备联动不足等问题,难以适应绿色低碳发展需求。本文设计了一款基于STM32的智能家居能源管理系统,通过多源能耗监测、负荷预测与优化调度技术,实现家庭能源的精细化管理与智能优化,提…

SpringBoot3—核心特性:基础特性

一、SpringApplication (1)自定义 banner 类路径添加 banner.txt 或设置 spring.banner.location 就可以定制 banner推荐网站:Spring Boot banner在线生成工具,制作下载英文banner.txt,修改替换banner.txt文字实现自…

无服务边缘融合架构:重新定义云原生应用边界

引言:零部署计算的革命突破 Airbnb迁移至LambdaEdge架构后,全球客房详情页渲染延迟降至35ms,冷启动时间缩至50ms以内。Stripe采用无服务边缘计算处理支付事务,成功将动态API响应P99延迟从210ms压缩至19ms。AWS官方基准显示&#…

HTTP/1.0、HTTP/1.1、HTTP/2 核心区别对比

前言 经常开发的小伙伴估计对http都不陌生,下面来看看的之间的区别是啥? 一、连接管理 ‌HTTP/1.0‌ 每个请求需单独建立和关闭 TCP 连接,无法复用,导致高延迟和资源浪费‌。 无状态设计,服务器不记录客户端上下文…

数据集笔记:新加坡LTA Taxi Availability

1 数据集介绍 获取新加坡可用出租车的位置每30秒从LTA的Datamall获取一次数据 建议每分钟调用此端点 响应是一个有效的GeoJSON,可以将其插入到如Leaflet这样的地图工具中由于LTA不提供任何元数据,因此响应中的时间戳为抓取数据的时间使用date_time参数以…

告别GitHub连不上!一分钟快速访问方案

一、当GitHub抽风时,你是否也这样崩溃过? 😡 npm install卡在node-sass半小时不动😭 git clone到90%突然fatal: early EOF🤬 改了半天hosts文件,第二天又失效了... 根本原因:传统代理需要复杂…