递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 火山 源码 类库
查看: 11516|回复: 10
打印 上一主题 下一主题

[讨论帖] - 轻量级阅读器到底怎么搞

 关闭 [复制链接]

42

主题

192

帖子

1万

积分

论坛元老

三东省焚化部副主任

Rank: 8Rank: 8

积分
11227
QQ
跳转到指定楼层
楼主
发表于 2017-8-8 11:55:45 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 雾里看花 于 2017-8-8 15:17 编辑

     几年前的想法了,那个时候刚接触JAVA,初始目的就是为了写一款轻量级阅读APP,
大概两年前吧,我开始尝试写APP, 当时没有并没有把阅读器想的太难,
实际编写过程中还真没有那么难(我说的前期), 直到某一天,我处理完了前期代码,开始编写阅读组件,
心中万只法克鱿鱼,数不胜数的草泥马儿,
====================================================================

  首先,第一个难题就是,阅读组件到底是个啥玩意?到底是继承自TextView的自定义组件还是个啥?
于是我开始百度..百度..百度,最后,我发现了FB,心中甚喜,
于是我跑到github上下载了FB源代码,打开Eclipse,导入工程,就在我欢喜的想要编译的时候,一个个叉号出现在我的眼前。
(此处重复上面的心情),弄么办?百度呗,当时网上能找到的集成FB的教程不是很多,大多数都是复制的,千篇一律。
最后苦心不服有心人,找到一篇有用的,根据步骤,安装NDK,编译JNI,引入lib,重建,编译,
不知道试了多少天,克服了多少喜马拉雅山一般的困难,终于编译成功了,

接下来就是开始集成FB了,(当时的一篇集成教程是TM的E文!)
根据翻译结果,加上自己的理解,开始集成FB,中间艰辛我就不说了,说起来现在还想哭,
略过中间的艰辛,反正最后是成功了,然而,在集成FB的过程中,我的脑海中不断的浮现出一段话:"为什么要集成FB?我要做轻量级阅读APP,又不是全格式的万能阅读"

  我开始正视我的问题,
1.我要做的是一款轻量级的阅读APP,
2.我只需要它能够显示文字就可以,
3.咩有3了,只有以上两个,所以说,我为什么要用FB ,我特么就是脑子抽了...

  轻量级阅读器,我只需要它能够处理断章,能够分页,能够把一页的内容不多不少的显示出来就可以了
整理好自己的思路之后,我扔下了FB,开始考虑怎么搞这么一个组件,首先,我确定了就用TextView了,
首先,第一个问题是,怎么才能够得出TextView一页能够显示多少文字呢?
我开始查看TextView的源代码,好吧,我看了几十行就看不下去了. 有点犯恶心,
突然想到,我为什么非要纠结于一页能够显示多少文字呢? 我为什么不能计算一行显示多少字,然后计算有一页有多少行呢?其实这结果和一页显示多少文字是一样的! 思路又回到正轨了上.........


临时有事,办完续发
续写:

   思路回不来了....
说到要计算行字符数量和行数,最后的结果是约等于一页容纳的字符数量,为什么是说大约呢,因为E文和中文的宽度不一样,而且字体尺寸是float
那怎么计算这些数量呢?很简单,TextView的一个重载方法,OnDraw(),
在OndRaw中,我们计算出一页大约能显示多少字符,
getHeight();  取得view的高度
getLineHeight(); 取得行高度
getTextSize();        取得 字体尺寸  其返回值是float
getWidth     取得View的宽度


咦... as中复制出来还自带颜色特效!  真是DuangDuangDuang....
通过以上几个方法,我们计算出一页大约能显示多少字符,但是其中有用的还是  计算出的行数和行字数,因为在断行分页的时候主要靠这两个参数。


知道了行数和行字数,剩下的就是断行分页,
断行分页的功能
断行的实现:
  先根据原文章中的/n进行...进行分割,就像是易语言中的 array = 分割文本(str,"\n"),这样就得到了一个行数据数组,
  数组结构:{
                         数组0:= “我是第一行字符串”
                         数组0:= “我是第二行字符串”
                         数组0:= “我是第三行字符串”
                    }
(PS:如果说原文章就是一篇连在一起的内容,那就可以跳过这里了,直接根据行字符数量来截取字符吧)


  然后主要是根据行字数这个参数来截取字符,其中还要记得首行加两个大空。还有,如果行位只有半个字符的话,那就另起一行,
最后,如果方法正确,那么,你就可以得出以下结果



as输出和真机显示测试,

得出了以上的结果,那就说明你的断行处理是没有问题的,接下来就是分页

分页就没那么麻烦了,简直就是super Easy了,
随便一个储存类型

比如,来一个List<Map<String, Object>>储存
[size=13.0667px]根据View行数循环,把断行数据糅合成一页加入到变量中
map.put("一块五的随便",[size=13.0667px]str);
[size=13.0667px]储存.add([size=13.0667px]map[size=13.0667px])
[size=13.0667px]

[size=13.0667px]这样,第一页就是 储存.get(0).get("[size=13.0667px]一块五的随便[size=13.0667px]")
[size=13.0667px]这样,[size=13.0667px]第二页就是 储存.get(1).get("[size=13.0667px]一块五的随便[size=13.0667px]")
[size=13.0667px]......
[size=13.0667px]MD,既简单,又方便,而且维护成本大大大大大*n的减小。
[size=13.0667px]

[size=13.0667px]最后,美化美化,一个textView摇身一变,就变成了主流轻量级阅读器的阅读组件




最后,为了应对不同编码,最好在处理断行之前就把编码转为uFO-..... utf
[size=13.0667px]

[size=13.0667px]

[size=13.0667px]行了,水帖到此结束,AS真DuangDuangDuang,[size=13.0667px]
另  本文中我尽量使用使用通俗易懂的语言来方便木有基础的人明白,所以在表达上可能有错误,欢(就)迎(你)大(废)家(话)指(对)出.....




补一张实际运行动图:


回复

使用道具 举报

4

主题

120

帖子

2133

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
2133
沙发
发表于 2017-8-8 12:55:05 | 只看该作者
等待中。。。。。。
回复

使用道具 举报

8

主题

162

帖子

760

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
760
板凳
发表于 2017-8-8 13:06:19 | 只看该作者
等待结果。
回复

使用道具 举报

81

主题

497

帖子

3761

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
3761
地板
发表于 2017-8-8 14:14:26 | 只看该作者
等下文……
回复

使用道具 举报

1

主题

15

帖子

71

积分

注册会员

Rank: 2

积分
71
5#
发表于 2017-8-8 16:15:44 | 只看该作者
顶一顶
回复

使用道具 举报

81

主题

497

帖子

3761

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
3761
6#
发表于 2017-8-8 21:31:19 | 只看该作者
楼主错字了!看附件

错字.jpg (56.91 KB, 下载次数: 213)

错字.jpg
回复

使用道具 举报

2

主题

27

帖子

381

积分

中级会员

Rank: 3Rank: 3

积分
381
7#
发表于 2017-8-8 23:09:11 | 只看该作者
还以为会分享源吗呢!!
回复

使用道具 举报

1

主题

15

帖子

71

积分

注册会员

Rank: 2

积分
71
8#
发表于 2017-8-10 20:00:49 | 只看该作者
用易写过,字是要计算处理的,主要是切分时,半个字的问题

只是火山还没有写过,一时用不上,也不会,暂时不写了。

不过还是支持楼主,顶一顶的。
回复

使用道具 举报

4

主题

187

帖子

1万

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
13693
9#
发表于 2017-8-11 13:56:09 | 只看该作者
坐等 楼主很厉害!
回复

使用道具 举报

14

主题

105

帖子

651

积分

贵宾

Rank: 9Rank: 9Rank: 9

积分
651
QQ
10#
发表于 2018-11-15 08:50:14 | 只看该作者
感谢楼主的方案, 文本数据的分页根据楼主的思路,已经完成,不过我是集成View直接绘制的,这样动画效果炫上天都可以,反正都是画上去的,不过现在还有个问题需要请教下楼主,请问本地txt分章如何实现? 这个分章我大概想了十几种方案,但是都不可行,下面我说下,如果您能够看到,希望楼主能够赐教.

我是通过一段一段的循环读取字符,直至到达文件尾, 中间读取到的数据,使用正则来匹配是否出现了"第0-10,零-十*[章节回卷话篇部]",这几种我见过的章节名称类型, 匹配到了的话,那就加入到list中,并且记录章节名称的开始结束和正文的开始结束,  问题是,书籍有的章节命名方式不一致,前面命名都是第xxx章 xxxx章节名, 但是突然出现一个 话外篇... 某某某某篇外篇,更有什么 作者敢言,这种东西一出现根本就不会将其解析成一个独立的章节,而是作为上一章的内容.
我看过掌阅的章节处理,掌阅就能够将其解析出来,不知道如何实现.而且我在网上也找过很多资料,但是看其代码,都没有处理这一种问题,  如果楼主碰到过类似的问题,并且已经解决了,请求楼主告知.

Github加载过来的图,可能加载有些慢,

火山基础入门,100元特价优惠!
加群咨询:710113438
详情:http://jc.wlxs.net/
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|递归火山软件开发平台 ( 鄂ICP备18029190号 )

GMT+8, 2024-11-29 22:03 , Processed in 0.098879 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表