前一阵由于项目的需求,需要一个预览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小说阅读器的实现(完美实现分页阅读,支持常见编码格式)...相关推荐

  1. android xml mpg格式,急求: android如何对mpg格式视频实现在线播放?

    急求: android怎么对mpg格式视频实现在线播放??? 对于3GP格式的视频都直接可以进行播放,但是对mpg格式谈话对话框提示无法播放此视频.是不是mpg格式的还需要我特别进行格式转化呢? 播放 ...

  2. 集成Vitamio来播放网络视频(支持多种格式解码)

    集成Vitamio来播放网络视频(支持多种格式解码) 在android里面可能会用到播放网络视频,但是android SDK自带的播放视频并不能满足我们要求,因为支持的格式有限,有时只有声音没有头像. ...

  3. MTK平台 Android11 支持exFat格式T卡

    最近项目中想在MTK 的Android11版本中增加支持exfat格式的t卡,参考了CSDN上的几个博客的方法,成功实现了该功能. 因为几个博客的kernel和external 的代码的版本都各有不同 ...

  4. 北大青鸟java第一单元项目_北大青鸟java第一单元项目迷你TXT小说阅读器

    [实例简介] 自用 已通过老师检测 得分88分 北大青鸟java第一单元项目迷你TXT小说阅读器,可以作为java se学习项目也可以作为其他项目,项目完整可直接运行 [实例截图] [核心代码] TX ...

  5. 【护眼阅读】PC端通过主流常用浏览器打开本地WEB页面阅读本地TXT小说

    自用-通过WEB页面阅读本地小说,生成章节导航,设置字色和背景色达到护眼目的,HTML+CSS+JS 章节导航 需求分析 HTML代码 CSS代码 JS代码 总结 章节导航 从分析需求入手,查找资料, ...

  6. 《小说阅读》txt小说浏览器、小说阅读、小说语音阅读

     2022年12月17日 更新 1.更新超万字章节 分页显示. 2.修复一些BUG... 最新下载地址: GitHub - flove2012/YiNian: vb.net and C++vb.net ...

  7. android能播放4k视频格式,安卓APP,无广告支持多种格式的万能视频播放器

    原标题:安卓APP,无广告支持多种格式的万能视频播放器 万能视频播放器 万能视频播放器是一款专业的视频播放工具.它支持所有视频格式,支持 4K/超高清视频文件,并且能够高清播放.它是安卓手机和平板上欣 ...

  8. 免费小说阅读器(Android版本)全站开源

    此小说阅读器只追求两项 极简(无广告,无添加) 丰富(内容丰富,只有你想不到的,没有它没有的) 漫品客户端 全站开源 开源地址: https://github.com/AnyMarvel/ManPin ...

  9. 开源android手写批注,浅析各阅读平台手写批注 智器阅读显身手

    随着电子阅读媒介的流行和阅读成本的降低,电子终端已经成为日常读书看报的工具,用户对阅读速度和功能的要求也随之提高.自古"不动笔墨不读书",电子阅读已经突破仅仅阅读的阶段,凸显&qu ...

最新文章

  1. 数组,结构体初始化为0
  2. Acwing第 37 场周赛【完结】
  3. mxnet基础到提高(11)--循环
  4. 基于SCN的查询(AS OF SCN)
  5. [09]CSS 边框与背景 (上)
  6. 每个人都要在自己的“时区”里找到自己的快乐
  7. redis 和 数据库mysql之间的关系
  8. ibatis 数据库获取不到 java_如何拦截ibatis中所有的执行sql,并记录进数据库
  9. NOI数学之提高级:初等数论
  10. 2018.12.2 频谱分析
  11. 每个星座对应的天使。
  12. LeetCode 103——二叉树的锯齿形层次遍历
  13. linux值centos7安装docker
  14. C语言也能干大事第十三节(如鹏基础)
  15. 百词斩不复习_百词斩是不是真的好用?
  16. 巨佬Jake Wharton谈Android对Java 8的支持
  17. 判断四个点是否在同一个平面上
  18. QPython 3C 操作 压缩包
  19. 复合型人才八种能力_刚毕业在设计院做结构设计,感觉自己对很多东西都没有判断的能力,工作之外如何提升自己在结构方面的知识?...
  20. Python:后缀为whl的文件是什么?如何安装whl文件?

热门文章

  1. 旭日图(echarts)
  2. python除法编程_跟老齐学Python之啰嗦的除法
  3. 【lua】Aegisub的核心API解读
  4. 浅析向上转型和向下转型
  5. google pixel 手机获取root权限
  6. Windows Server 2016远程桌面服务配置方法
  7. LWIP学习笔记---网际控制报文协议ICMP
  8. Third season eighteenth episode,hypnotic recording(maybe you can remember 吕子乔)
  9. 细谈渗透测试的前期工作——信息收集
  10. html文件无法复制粘贴,无法复制粘贴的解决办法