android 支持各种格式的阅读器,android txt小说阅读器的实现(完美实现分页阅读,支持常见编码格式)...
前一阵由于项目的需求,需要一个预览txt文件的功能,于是自己写了一个,简单的txt文件阅读器,实现了点击分页切换、滑动分页切换,效果如下:
既然做出来,想整理一下实现的思路,有时间再封装一下,做成一个自己喜欢的风格的阅读器。
实现这个肯定是自定义view啦,将字符一个一个的画上去,自己定义行距、上下左右边距、字体大小、背景、字体样式等等。然后复写了ontouch事件,完成手势,使之实现点击切换,滑动切换。
整个阅读器的难点,我觉得在以下三个部分:
1.数据分页。
2.支持不同编码格式。
3.切换手势。
好啦,一个一个说。
1.数据分页。因为看的是一页一页的看的,所以必须拿出一页一页的数据画到bitmap上去。那么上一页的结束位置必须要与下一页的开始位置衔接起来,除外发现了一个问题,每一页除了衔接之外还要分行,行数必须要根据屏幕的大小、字体大小、行间距来计算出来。好像不好做,如何分行啊。通过找资料,发现paint有个方法可以返回可以显示的字符数,就是可以返回指定字符串可以显示的字符数。所以可以通过这个进行分行了。
mPaint.breakText(str, true, with, null);
在分行的时候又发现了一个问题。我们发现阅读器每一段的最后一行并不全是满行的,这样直接分行会导致一个问题,就是段落的最后一行或许会与下一段的开始一行的开头在同一行。解决的方法就是先分段在分行。
分段的方法:
/**
* TODO将字符串分段 上午8:59:18
*
* @param datas
* @return
*/
public List SeperateByParagph(String datas) {
List paragphdatas = new ArrayList();
if (datas != null) {
String[] ps = datas.split("\r\n");
for (int i = 0; i < ps.length; i++) {
ps[i] = ps[i] + " ";
paragphdatas.add(ps[i]);
}
if (paragphdatas.size() > 0) {
String lastp = paragphdatas.get(paragphdatas.size() - 1).substring(0,
paragphdatas.get(paragphdatas.size() - 1).length() - 1);
paragphdatas.remove(paragphdatas.size() - 1);
paragphdatas.add(lastp);
}
} else {
paragphdatas.add(datas);
}
return paragphdatas;
}
分行的方法:
/**
* 将段落字符串截取成句数据,存储在集合里 2016年1月7日上午10:46:44
*
* @param mpPaint
* @param paragraphstr
* @return
*/
public List SeparateParagraphtoLines(String paragraphstr) {
Paint mPaint = getTextPaint();
mPaint.setSubpixelText(true);
List linesdata = new ArrayList();
String str = paragraphstr;
int with = getWindowWith() - getTxtReadConfig().getPaddingleft() - getTxtReadConfig().getPaddingright();
for (; str.length() > 0;) {
int nums = mPaint.breakText(str, true, with, null);
if (nums <= str.length()) {
String linnstr = str.substring(0, nums);
linesdata.add(linnstr);
str = str.substring(nums, str.length());
} else {
linesdata.add(str);
str = "";
}
}
return linesdata;
}
所以分页的过程如下:
分页了之后,需要标志该页的开始位置与结束位置,为了下次分页的时知道在哪里开始。
public class PageEntity {
private int firstbyetposition;
private int lastbyteposition;
private int pageindex;
private List LinesData;}
这里顺便说一下,为了实现页的进度跳转,必须对整个txt文件进行分页,分页的结果可以通过数据库保存起来,保存的数据就是保存每一页的开始位置与结束位置。这样跳转到指定页的时候只需要获取指定位置的数据就可以了。所以没有完成分页的时候可以通过上面的流程进行获取数据,分页完成后可以直接获取指定位置的数据就可以了。
分页的基本思路就是这样!
2.解决编码的问题。难点就是获取文件的编码,自己怎么弄都获取不正确,后来找到一个文件编码检测器的 东西,发现获取是还是蛮准确是。我的处理思路是获取文件的编码,如果是utf-8的话就在直接处理,不是的话就先将整个文件转为utf-8的编码后再处理。
3.切换手势。基本的思路就是如下,其实发现效果也不是特别完美,有时间再看看完善一下。
android 支持各种格式的阅读器,android txt小说阅读器的实现(完美实现分页阅读,支持常见编码格式)...相关推荐
- android xml mpg格式,急求: android如何对mpg格式视频实现在线播放?
急求: android怎么对mpg格式视频实现在线播放??? 对于3GP格式的视频都直接可以进行播放,但是对mpg格式谈话对话框提示无法播放此视频.是不是mpg格式的还需要我特别进行格式转化呢? 播放 ...
- 集成Vitamio来播放网络视频(支持多种格式解码)
集成Vitamio来播放网络视频(支持多种格式解码) 在android里面可能会用到播放网络视频,但是android SDK自带的播放视频并不能满足我们要求,因为支持的格式有限,有时只有声音没有头像. ...
- MTK平台 Android11 支持exFat格式T卡
最近项目中想在MTK 的Android11版本中增加支持exfat格式的t卡,参考了CSDN上的几个博客的方法,成功实现了该功能. 因为几个博客的kernel和external 的代码的版本都各有不同 ...
- 北大青鸟java第一单元项目_北大青鸟java第一单元项目迷你TXT小说阅读器
[实例简介] 自用 已通过老师检测 得分88分 北大青鸟java第一单元项目迷你TXT小说阅读器,可以作为java se学习项目也可以作为其他项目,项目完整可直接运行 [实例截图] [核心代码] TX ...
- 【护眼阅读】PC端通过主流常用浏览器打开本地WEB页面阅读本地TXT小说
自用-通过WEB页面阅读本地小说,生成章节导航,设置字色和背景色达到护眼目的,HTML+CSS+JS 章节导航 需求分析 HTML代码 CSS代码 JS代码 总结 章节导航 从分析需求入手,查找资料, ...
- 《小说阅读》txt小说浏览器、小说阅读、小说语音阅读
2022年12月17日 更新 1.更新超万字章节 分页显示. 2.修复一些BUG... 最新下载地址: GitHub - flove2012/YiNian: vb.net and C++vb.net ...
- android能播放4k视频格式,安卓APP,无广告支持多种格式的万能视频播放器
原标题:安卓APP,无广告支持多种格式的万能视频播放器 万能视频播放器 万能视频播放器是一款专业的视频播放工具.它支持所有视频格式,支持 4K/超高清视频文件,并且能够高清播放.它是安卓手机和平板上欣 ...
- 免费小说阅读器(Android版本)全站开源
此小说阅读器只追求两项 极简(无广告,无添加) 丰富(内容丰富,只有你想不到的,没有它没有的) 漫品客户端 全站开源 开源地址: https://github.com/AnyMarvel/ManPin ...
- 开源android手写批注,浅析各阅读平台手写批注 智器阅读显身手
随着电子阅读媒介的流行和阅读成本的降低,电子终端已经成为日常读书看报的工具,用户对阅读速度和功能的要求也随之提高.自古"不动笔墨不读书",电子阅读已经突破仅仅阅读的阶段,凸显&qu ...
最新文章
- 数组,结构体初始化为0
- Acwing第 37 场周赛【完结】
- mxnet基础到提高(11)--循环
- 基于SCN的查询(AS OF SCN)
- [09]CSS 边框与背景 (上)
- 每个人都要在自己的“时区”里找到自己的快乐
- redis 和 数据库mysql之间的关系
- ibatis 数据库获取不到 java_如何拦截ibatis中所有的执行sql,并记录进数据库
- NOI数学之提高级:初等数论
- 2018.12.2 频谱分析
- 每个星座对应的天使。
- LeetCode 103——二叉树的锯齿形层次遍历
- linux值centos7安装docker
- C语言也能干大事第十三节(如鹏基础)
- 百词斩不复习_百词斩是不是真的好用?
- 巨佬Jake Wharton谈Android对Java 8的支持
- 判断四个点是否在同一个平面上
- QPython 3C 操作 压缩包
- 复合型人才八种能力_刚毕业在设计院做结构设计,感觉自己对很多东西都没有判断的能力,工作之外如何提升自己在结构方面的知识?...
- Python:后缀为whl的文件是什么?如何安装whl文件?
热门文章
- 旭日图(echarts)
- python除法编程_跟老齐学Python之啰嗦的除法
- 【lua】Aegisub的核心API解读
- 浅析向上转型和向下转型
- google pixel 手机获取root权限
- Windows Server 2016远程桌面服务配置方法
- LWIP学习笔记---网际控制报文协议ICMP
- Third season eighteenth episode,hypnotic recording(maybe you can remember 吕子乔)
- 细谈渗透测试的前期工作——信息收集
- html文件无法复制粘贴,无法复制粘贴的解决办法