android 电子书阅读器epub解析、全文关键字搜索功能
上半年公司一直很忙 也没时间将此功能进行整理 我相信大多数人还是需要的 先说一下此功能的背景吧 之前阅读器是嵌入的H5自然与我们关系不大 后来领导说要采用原生的阅读器还要支持epub格式解析、更为重要的是需要全文关键字检索 这可把我难住了 因为以前从来没有做过类似的功能 领导只给了一周时间 然后就是各种找三方阅读器、找解析 最后终于结束了 给自己点个赞!!!
接下来进入正题,首先我找的三方阅读器FBReader 这可以说是目前唯一开源的阅读器 没有之一
项目源码:https://github.com/koreader/koreader 开源项目
当时感觉靠谱所以就开始找类似的项目,果然找到了,于是我就参考源码完成了阅读器的功能,而且这个开源项目是支持epub格式解析的哦 这是我的效果图:
阅读器就这是这个样子,重点说一下关键字全文搜索功能:
-------------------------- 华丽丽的分割线,修改起因 -----------------------------
FBReader提供了文字搜索功能,但只能通过左右按钮依次进行切换跳转,深感不便,如下图一所示:
本文通过对源码的改进,将搜索功能扩展,搜索结果及其在原文中的位置百分比,以列表的形式展现(并前后添加五个字作为区分),可以通过列表项的点击,轻松跳转到任意一条搜索结果显示页。效果如上图二、图三所示。
-------------------------- 源码分析 -----------------------------
首先,看下源码搜索的调用逻辑,如下图所示:
从上图的调用关系,可以看出,在ZLTextPlainModel里面用private ArrayList<ZLTextMark> myMarks;来保存了ZLTextMark类型的数据,作为搜索结果的存储。
再来看下ZLTextMark类,里面定义了三个参数,来记录搜索结果在文件中的位置,和长度,以此定位跳转
public final int ParagraphIndex;
public final int Offset;
public final int Length;
从上图中,亦可看出,搜索的实际操作,是通过ZLSearchUtil类的find方法来实现的。源码中,以忽略大小写模式为例,
在搜索成功后,会返回文字位置偏移,再以此为基础,循环进行下一次搜索,直至结尾:
if (j >= patternLength) {
return i - offset;
}
---------------------- 分割线又来了,马上修改代码喽 ----------------------
通过前面的介绍,大概了解了搜索的过程,和存储。更详细的信息,请查阅源码,不再赘述。
那么,想达到预期的效果,我做了以下修改:
修改内容示意图如下:
代码部分如下:
一、为ZLTextMark添加内容参数:
既然,我们想列表显示,就不能只显示搜索内容,都是一样的噻。因此,添加了public final String AroundContent;参数,来存储搜索结果。在搜索内容的前面和后面,各加了五个字,以做区分。
二、在搜索过程中,为ZLTextMark新参数,拼接内容:
在ZLSearchUtil的find方法中,搜索成功时,添加了蓝色字体代码,为搜索内容添加前后缀内容:
if (j >= patternLength) {
int start = i - AROUND_RANGE;
int end = i + patternLength + AROUND_RANGE;
// Avoid out of range
if(start < 0) start = 0;
if(end > text.length - 1) end = text.length - 1;
char[] ca = new char[end - start];
for(int m=start; m<end; m++) {
ca[m-start] = text[m];
}
mAroundContent = String.valueOf(ca);
return i - offset;
}
当然,为外面提供了获取当前内容的接口方法:
private static String mAroundContent; // current content
public final static int AROUND_RANGE = 5; // previous and after additional word number
public static String getCurrentAroundContent() {
return mAroundContent;
}
三、在搜索存储变量中添加结果内容:
我们已经为ZLTextMark添加了新参数,就在搜索存储时,为其设置,因此,将下面的代码
myMarks.add(new ZLTextMark(index, offset + pos, pattern.getLength())
添加扩展参数,修改为
myMarks.add(new ZLTextMark(index, offset + pos, pattern.getLength(),
ZLSearchUtil.getCurrentAroundContent()));
经过上述修改,再次获得myMarks内容后,里面存储的ZLTextMark就比原来多出了一项内容,可以供我们在列表中显示了。
---------------------------------- 分割线,再看下列表 ----------------------------------
看过代码的话,可以了解到ZLTextMark的ParagraphIndex参数,是指当前内容所在的段落索引。而我们在打开书籍后,又可以通过myFBReaderApp.Model.getTextModel().getParagraphsNumber();来获取书籍的总段落数量,因此前面显示的百分比,就很容易计算出来了。
ok,添加前后缀的内容有了,百分比也有了。列表的设置,就不用多说了吧。
还可以说一句,点击跳转,需要在FBReaderApp中做一个扩展,源码的ZLTextView提供了gotoMark(ZLTextMark mark)方法的,看下源码就晓得了。
------------------------------- 最后的分割线,可以结束了 --------------------------------
以上,便是修改的全部思路了。希望能对需要的人有所帮助。
后记:内容只是笔者自己的理解,和实践的一个记录,如有不妥和错误之处,也请及时指出,以便及时更正,以免自误误人。可发至邮箱:1070543858@qq.com
android 电子书阅读器epub解析、全文关键字搜索功能相关推荐
- Android电子书阅读器的设计与实现
Android电子书阅读器 包括Android客服端和jsp服务端 主要有,在线图书,本地图书,用户设置,书签管理,JSP后台,可以管理用户帐号,图书信息管理 我的QQ 609085431
- Android电子书阅读器小程序(txt)
Android电子书阅读器小程序(txt) 开发环境 JDK 1.8 操作系统 Windows×32位或64位 可行性分析 技术可行性: 本项目应用的均是上课所学习的内容. 软件可行性: 用平时学习的 ...
- android电子书阅读器
2019独角兽企业重金招聘Python工程师标准>>> 本地电子书 一款干净美观的本地电子书阅读器,为了世界和平,决定将代码开源,稍加处理,即可实现各种梦幻功能. #源码中有三本电子 ...
- Android电子书阅读器开发笔记(1):创建电子书阅读器项目
项目开发工具是Android Studio. 创建项目 选择菜单命令:File->New->New Project,填入项目信息. (2)设置项目运行的设备和最低Android SDK版本 ...
- 基于android的电子书阅读器app
基于android的电子书阅读器app 基于Android平台的电子书阅读器的设计与实现主要通过Eclipse开发工具, Java语言与Sqlite数据库来完成的.本阅读器实现了本地阅读,手动翻页,书 ...
- 一个简易版的iphone电子书阅读器
2019独角兽企业重金招聘Python工程师标准>>> 一个简易版的iphone电子书阅读器 里面的基本功能都有了 感兴趣的朋友可以下来研究 点击此处下载源码 转载:http://w ...
- 新一代亚马逊电子书阅读器Kindle Paperwhite全球同步上市
- 全新的纯平设计,配备300ppi超清电子墨水屏,还原纸书阅读体验- 更为轻薄的机身设计,令单手握持更为舒适- 首款防水设计的Kindle Paperwhite,可在更多场景安享阅读 北京2018年 ...
- 有哪些能支持epub、txt格式的电子书阅读器?能在安卓手机上用的?
在手机上看书有许多方便之处,随着智能手机的硬件功能越来越发达,无论大学生还是工作族每天与手机端网络资源相接触已经成为了我们生活的常态.可是不得不说手机端打开资源的方式又常常会令我们头痛,那么如何能够又 ...
- 有哪些能支持epub、txt格式的电子书阅读器?能在MAC上用的?
在电脑上看书有许多方便之处,无论是使用键盘记笔记.或者是大屏幕处理网络与工作资源.确实,无论大学生还是工作族每天与电脑端网络资源相接触已经成为了我们生活的常态.可是不得不说Mac端打开资源的方式又常常 ...
最新文章
- Linux那些事儿之我是Sysfs(11)sysfs 创建普通文件
- js中substr,substring,indexOf,lastIndexOf的用法
- igraph 算网络指标_量化投资中,计算技术指标时常见的8个坑
- CSS——清除浮动的六种解决方案
- 整数数组查找java_使用Java编写程序以查找整数数组中的第一个非重复数字?
- pyecharts第九节、旭日图(现代饼图)
- TCP浅谈为什么3次握手
- 第十二题:设int x=1,float y=2,则表达式x/y的值是:
- 生产者消费者之阻塞队列版本
- dataframe 查找特定值_C++初级编程NOIP题:11H1544: 查找特定的值
- python极简讲义 pdf_Python极简讲义:一本书入门数据分析与机器学习
- 单龙芯3A3000-7A1000PMON研究学习-(10)撸起袖子干-pmoncfg Bonito 干了什么?(这是make cfg的部分)
- CATIA软件常见问题解答
- 画出传输门、三态门、开路门_传输门和三态门什么区别
- 【鸿蒙应用开发】-入门
- 卷积和反卷积输出的计算公式
- 生存或毁灭? 国内DIY现状大型调查分析
- unityshader中的顶点着色器与片段(元)着色器
- 扁平化ui设计界面的方式以及扁平化ui图标设计特点
- oracle数据误删怎么恢复,Oracle数据误删了怎么恢复
热门文章
- 各编程语言 + aardio 相互调用示例
- 青蛙跳水杯(蓝桥杯)--宽度优先搜索
- 大学四年看了这18般书籍,我成了别人眼中的程序员大神!
- JAVA2实验3分支与循环语句,实验3控制语句:分支、循环.doc
- 漫威电影人物关系可视化
- 20135327郭皓--读书笔记六
- 【量化】量化交易入门系列2:经典的量化交易策略(上)
- 计算机视觉基础系列(python与opencv的操作与运用/tensorflow的基础介绍)(八)---小例子(神经网络逼近股票收盘价格)
- 【精品】Thymeleaf 语法基础
- html5移动端点击复制,H5实现移动端复制文字功能