安卓小说阅读器分页如何实现
1. 如何实现电子书的分页显示功能
经过几个小时的思考,终于有了解决方案,拿出来和大家分享,目前可以实现UILabel尺寸固定,
然后,根据文本内容和字体动态分页显示的效果。电子书方面的应用应该非常有用。
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
//
totalPages = 0;
currentPage = 0;
//
textLabel.numberOfLines = 0;
//
if (!text) {
// 从文件里加载文本串
[self loadString];
// 计算文本串的大小尺寸
CGSize totalTextSize = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE_MAX]
constrainedToSize:CGSizeMake(textLabel.frame.size.width, CGFLOAT_MAX)
lineBreakMode:UILineBreakModeWordWrap];
// 如果一页就能显示完,直接显示所有文本串即可。
if (totalTextSize.height < textLabel.frame.size.height) {
textLabel.text = text;
}
else {
// 计算理想状态下的页面数量和每页所显示的字符数量,只是拿来作为参考值用而已!
NSUInteger textLength = [text length];
referTotalPages = (int)totalTextSize.height/(int)textLabel.frame.size.height+1;
referCharatersPerPage = textLength/referTotalPages;
// 申请最终保存页面NSRange信息的数组缓冲区
int maxPages = referTotalPages;
rangeOfPages = (NSRange *)malloc(referTotalPages*sizeof(NSRange));
memset(rangeOfPages, 0x0, referTotalPages*sizeof(NSRange));
// 页面索引
int page = 0;
for (NSUInteger location = 0; location < textLength; ) {
// 先计算临界点(尺寸刚刚超过UILabel尺寸时的文本串)
NSRange range = NSMakeRange(location, referCharatersPerPage);
// reach end of text ?
NSString *pageText;
CGSize pageTextSize;
while (range.location + range.length < textLength) {
pageText = [text substringWithRange:range];
pageTextSize = [pageText sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE_MAX]
constrainedToSize:CGSizeMake(textLabel.frame.size.width, CGFLOAT_MAX)
lineBreakMode:UILineBreakModeWordWrap];
if (pageTextSize.height > textLabel.frame.size.height) {
break;
}
else {
range.length += referCharatersPerPage;
}
}
if (range.location + range.length >= textLength) {
range.length = textLength - range.location;
}
// 然后一个个缩短字符串的长度,当缩短后的字符串尺寸小于textLabel的尺寸时即为满足
while (range.length > 0) {
pageText = [text substringWithRange:range];
pageTextSize = [pageText sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE_MAX]
constrainedToSize:CGSizeMake(textLabel.frame.size.width, CGFLOAT_MAX)
lineBreakMode:UILineBreakModeWordWrap];
if (pageTextSize.height <= textLabel.frame.size.height) {
range.length = [pageText length];
break;
}
else {
range.length -= 2;
}
}
// 得到一个页面的显示范围
if (page >= maxPages) {
maxPages += 10;
rangeOfPages = (NSRange *)realloc(rangeOfPages, maxPages*sizeof(NSRange));
}
rangeOfPages[page++] = range;
// 更新游标
location += range.length;
}
// 获取最终页面数量
totalPages = page;
// 更新UILabel内容
textLabel.text = [text substringWithRange:rangeOfPages[currentPage]];
}
}
// 显示当前页面进度信息,格式为:"8/100"
pageInfoLabel.text = [NSString stringWithFormat:@"%d/%d", currentPage+1, totalPages];
}
////////////////////////////////////////////////////////////////////////////////////////
// 上一页
- (IBAction)actionPrevious:(id)sender {
if (currentPage > 0) {
currentPage--;
NSRange range = rangeOfPages[currentPage];
NSString *pageText = [text substringWithRange:range];
textLabel.text = pageText;
//
pageInfoLabel.text = [NSString stringWithFormat:@"%d/%d", currentPage+1, totalPages];
}
}
////////////////////////////////////////////////////////////////////////////////////////
// 下一页
- (IBAction)actionNext:(id)sender {
if (currentPage < totalPages-1) {
currentPage++;
NSRange range = rangeOfPages[currentPage];
NSString *pageText = [text substringWithRange:range];
textLabel.text = pageText;
//
pageInfoLabel.text = [NSString stringWithFormat:@"%d/%d", currentPage+1, totalPages];
}
}转载
2. 读取txt文件如何实现分页
如果不想损坏源文件 就第一种办法 首次打开让它加载一次 把数据保存在缓存中 (请求) 我能想到的只是这个办法了
3. 安卓电子书阅读器 自动翻页
基本上都支持自动滚屏 没有自动翻页。设置里有
最好的是开卷有益、掌阅,阅读器只需要这两个就够了,别的都垃圾
4. android编程:读取txt格式文件时怎样实现分页显示
ing 来是不行的。。要考虑大文件,50MB 的txt ,你不能先读完吧,先思考,搜索一下前辈怎么做的。
想好流程和方法后,再开始写,可以纸上画画,写之前去想的时间比开始写到写好时间长的时候,就对了,虽然基本不现实,大概就那个意思
简述一种做法:
得到txt file path
使用InputStream 类来读文件,返回一个byte[] ,读多少?--只要当前一屏幕的内容
然后获取文件编码格式 byte[] 转换为String : 例如new String(byte[] buffer, "UTF-8");
然后吧String 画出来,不是TextView 显示出来,是View 或者SurfaceView 去画出来,1个字1个字,或者一行一行,draw()出来
好了,这就是一种做法,利用InputStream 类读文件可以设置开始读的位置,读多少,来翻页(重复上诉过程,再画一屏幕)
你要学的还很多。
5. android开发,txt文件阅读器将.txt文件分页显示。
楼上楼下全是扯淡回答。。。大文本的情况下全部颠覆。。。网上没有一个真正实用有效的阅读器代码。首先,文本分页,U以为想分就分啊?文本多,分了半分钟没分完,用户缩放文本,是从头分页还是从这里分页?从当前位置分页,那往前分页呢?而且,一页的字数,不是定多少就真的那么多:100个换行符和普通字符能一样占一个页面?问题多着呢。
6. 那个Android的PDF阅读器可以实现用“点击”来“翻页”(一次翻一页,而不是拖动)
简单的回答就是:暂时不可能,而且很少有人设计那样的东西,因为,pdf是图片形式,所以,在无法保证看清楚字的情况下,拖拽操作很重要
7. 怎样实现Android开发小说在线阅读分章加载功能
想让自己成为高手吗?那就来思必达学院 让你从0到大师 搜思必达学院 思必达学院让你从小白变成高手
8. 安卓模拟器上的电子阅读器软件 翻页功能一般是通过什么实现的
点左面或右面!向左划或向右划
9. 求TXT小说阅读器,要可以分章节还可以分页的,就是一个章节分页,我讨厌那个滚动条!O(∩_∩)O谢谢
Juisreader 迷你txt小说阅读器 这个可以分章节 在选项里选分页方式 按章节分就可以 我一开始用的就是这个 很不错
不过后来我看致纯书院的资源 都是压缩的rar的 于是又去找了下 找到个派派阅读器 paipaireader
这两个界面都简单 我是喜欢这类型的啦~ 你直接网络搜索就有下载了 Juisreader 电驴也有下载 派派的那个直接就有论坛 不用注册就可以下载 那里的txt工具区还有很多其他相关的工具~
10. 基于Android的txt阅读器基本原理是什么
1、编码问题可以统一转换为一种编码显示(如utf-8);
2、分页的效果,包括动画,可以用ViewPager实现;
3、这个问题最难的还是如何把一堆文字按屏幕大小来分页。简单的思路就是,读取所有字符(防止文件过大,可以设置一次性读取的最大字符数)塞进第一屏,然后根据屏幕能显示的最大字符数截取,把截取后的字符放到第二屏显示,以此类推。
