19

我正在尝试制作一个 epub 阅读器

我想像 fbreader 一样进行分页

现在我有fbreader的源代码,但我不知道它在哪里实现分页

我在其他功能上有我的实现

我需要 fbreader 的只是分页

有没有人做过类似的事情?</p>

感谢您抽出宝贵时间阅读此问题。

ps:分页是把html文件分页,根据屏幕大小和字体大小,还有语言也要考虑,改变字体大小时,页码也随之改变。而epub文件内容为html格式

4

3 回答 3

4

这是令人着迷的代码。我很想看到原始学生项目的翻译(但我认为原始文件是俄文的)。由于这是一个 C++ 项目的一个端口,它在一些地方有一种有趣的编码风格。

该应用程序使用段落光标 ( ZLTextParagraphCursor )跟踪您在书中的位置。这种情况与数据库游标和记录分页比较。负责提供当前页面和计算页面数量的类是ZLTextView

由于epub是可重排文档而不是面向页面的,因此实际上并没有对页面进行具体定义 - 它仅取决于您碰巧在文档中的哪个位置(段落、单词、字符)以及显示设置。

于 2011-06-24T08:44:23.047 回答
4

正如 McLaren 所说,FBReader没有实现分页:它使用ZLibrary,它可以从与FBReader相同的网站获得。

原始代码使用它来计算当前页码:

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

但是,它非常简单,您不妨实现自己的。

于 2011-06-25T00:38:29.683 回答
2

我的理解是它使用了 3 个位图,当前和下一个。他们所做的是编写了一个文本,该文本通过这 3 个位图进行存储和读取。正如您在顶部看到的那样,他们计算您在其他示例中看到的滚动长度的段落数据。您可以在 android.view 包类 bitmapManager 开始逆向工程。这应该解释他们如何进行分页的一切。

于 2011-12-06T17:09:33.083 回答