我正在尝试制作一个epub阅读器
我想像fbreader那样进行分页
现在我有fbreader的源代码,但我不知道它在哪里实现分页
我有其他功能的实现
我需要的所有fbreader都是分页
有没有人做过类似的事情?
感谢您抽出时间阅读此问题。
ps:分页是将html文件吐出到页面,具体取决于屏幕的大小和字体的大小,并且语言也在考虑中,当改变字体大小时,页码也会改变。而epub文件内容是html格式
答案 0 :(得分:4)
这是令人着迷的代码。我很想看到原始学生项目的翻译(但我认为原始文件是俄文)。由于这是C ++项目的一个端口,因此它有一种有趣的编码风格。
应用程序使用段落游标( ZLTextParagraphCursor )跟踪您在书中的位置。这种情况与数据库游标和记录分页相比较。负责提供当前页面和计算页数的类是 ZLTextView 。
由于 epubs 是可重排文档而不是面向页面的,因此页面并没有真正的具体定义 - 它只取决于您在文档中的位置(段落,单词,字符)以及显示设置。
答案 1 :(得分:4)
正如迈凯轮所说,FBReader 没有实现分页:它使用 ZLibrary ,它可以从与FBReader相同的website获得。
原始代码使用它来计算当前页码:
size_t ZLTextView::pageNumber() const {
if (textArea().isEmpty()) {
return 0;
}
std::vector<size_t>::const_iterator i = nextBreakIterator();
const size_t startIndex = (i != myTextBreaks.begin()) ? *(i - 1) : 0;
const size_t endIndex = (i != myTextBreaks.end()) ? *i :
textArea().model()->paragraphsNumber();
return (myTextSize[endIndex] - myTextSize[startIndex]) / 2048 + 1;
}
Java版本使用此函数计算页码:
private synchronized int computeTextPageNumber(int textSize) {
if (myModel == null || myModel.getParagraphsNumber() == 0) {
return 1;
}
final float factor = 1.0f / computeCharsPerPage();
final float pages = textSize * factor;
return Math.max((int)(pages + 1.0f - 0.5f * factor), 1);
}
位于org.geometerplus.zlibrary.text.view.TextView
但是,如此简单,你也可以实现自己的。
答案 2 :(得分:2)
我的理解是它使用前一个和下一个的3位图。他们所做的是写了一个文本,通过这3个位图进行存储和读取。根据您在顶部看到的内容,他们计算段落数据,显示您在其他示例中看到的滚动的时长。您可以在android.view包类bitmapManager上启动逆向工程。这应该解释他们如何进行分页的所有内容。